using System;
using CoreGraphics;
using Foundation;
using UIKit;
namespace Shared
{
///
/// 右滑抽屉View
///
public class UIDrawerLayout : ViewGroup
{
///
/// 当前视图
///
/// The UICoverFlowView.
MyUIDrawerLayout mUIDrawerLayout
{
get
{
return uiView as MyUIDrawerLayout;
}
set
{
uiView = value;
}
}
UIView leftView;
UIView mainView;
///
/// 构造函数
///
public UIDrawerLayout()
{
mUIDrawerLayout = new MyUIDrawerLayout(this) { };
viewGroup = mUIDrawerLayout;
mainView = new UIView();
realViewGroup = mainView;
viewGroup.AddSubview(realViewGroup);
viewGroup.Layer.MasksToBounds = true;
leftView = new UIView();
//new UIView(new CGRect(0, 0, Application.CurrentWidth, Application.CurrentHeight));
var mFrame = leftView.Frame;
mFrame.Y = 0;
mFrame.X = 0;
mFrame.Width = Application.CurrentWidth;
mFrame.Height = Application.CurrentHeight;
mFrame.X = -Application.CurrentWidth;
leftView.Frame = mFrame;
leftView.BackgroundColor = UIColor.FromRGBA(0, 0, 0, 99);
viewGroup.AddSubview(leftView);
}
View leftChildView;
///
/// 增加左边视图
///
/// View.
public void AddLeftView(View view)
{
if (null == view)
{
return;
}
LeftViewRemoveAllViews();
view.Parent = this;
leftChildView = view;
//view.X = 0;
//view.Y = 0;
//view.Width = Width;
//view.Height = Height;
//view.Parent = this;
//view.Refresh();
var addFrame = leftView.Frame;
addFrame.X = 0;
addFrame.Y = 0;
//addFrame.Height = Height;
//addFrame.Width = Width;
leftChildView.RealView.Frame = addFrame;
leftView.AddSubview(leftChildView.RealView);
}
///
/// RemoveLeftView
///
public void LeftViewRemoveAllViews()
{
if (leftChildView == null) return;
if (leftChildView.RealView.Superview != null)
{
leftChildView.RealView.RemoveFromSuperview();
}
leftChildView.Parent = null;
}
///
/// 是否锁定右滑功能, 锁定后右滑弹出菜单失效
///
bool _IsDrawerLockMode;
public bool IsDrawerLockMode
{
get
{
return _IsDrawerLockMode;
}
set
{
_IsDrawerLockMode = value;
mUIDrawerLayout.IsDrawerLockMode = _IsDrawerLockMode;
}
}
bool _IsDrawerOpen = false;
private bool IsDrawerOpen
{
get
{
return _IsDrawerOpen;
}
set
{
_IsDrawerOpen = value;
mUIDrawerLayout.IsDrawerOpen = _IsDrawerOpen;
}
}
///
/// 打开抽屉view
///
public void OpenLeftMenu()
{
if (!IsDrawerOpen)
{
IsDrawerOpen = true;
ShowLeftView(IsDrawerOpen);
//System.Console.WriteLine("OpenLeftMenu-------");
}
}
///
/// 关闭抽屉view
///
public void CloseLeftMenu()
{
if (IsDrawerOpen)
{
IsDrawerOpen = false;
ShowLeftView(IsDrawerOpen);
//System.Console.WriteLine("CloseLeftMenu-------");
}
}
//private CABasicAnimation moveX(float X)
//{
// //CABasicAnimation animation = new CABasicAnimation("transform.translation.x");
// CABasicAnimation animation = CABasicAnimation.FromKeyPath("transform.translation.x");
// animation.To = NSNumber.FromFloat(X);
// animation.Duration = 0.2F;
// animation.RemovedOnCompletion = false;//yes的话,又返回原位置了。
// animation.RepeatCount = 1;
// animation.FillMode = CAFillMode.Forwards;
// return animation;
//}
///
/// 是否打开显示左边菜单view
///
private void ShowLeftView(bool bShow)
{
var mFrame = leftView.Frame;
mFrame.X = bShow ? 0 : -mUIDrawerLayout.Frame.Size.Width;
leftView.Frame = mFrame;
}
///
/// 移动左边view
///
public void MoveLeftView(nfloat XX)
{
if (IsDrawerOpen)
{
if (XX < 0)
{
var mFrame = leftView.Frame;
mFrame.X = 0 + XX;
leftView.Frame = mFrame;
}
}
else
{
if(XX > 0)
{
var mFrame = leftView.Frame;
mFrame.X = -mUIDrawerLayout.Frame.Size.Width + XX;
leftView.Frame = mFrame;
}
}
}
///
/// 重置左边view
///
public void ResetView()
{
var mFrame = leftView.Frame;
if (IsDrawerOpen)
{
mFrame.X = 0;
//System.Console.WriteLine($"Reset Open");
}
else
{
mFrame.X = -mUIDrawerLayout.Frame.Size.Width;
//System.Console.WriteLine($"Reset CLOSE");
}
leftView.Frame = mFrame;
}
nfloat mLastX, mLastY, deltaX;
int mTouchSlop = 3;
private void MYTouchEvent(EventActions eventAction, CGPoint point)
{
if (_IsDrawerLockMode) return;
switch (eventAction)
{
case EventActions.Down:
//记录点击的最新X坐标
mLastX = point.X;
mLastY = point.Y;
//System.Console.WriteLine($"DrawerLayout:EventActions.Down XXX{mLastX}");
break;
case EventActions.Move:
moveWithPoint(point);
//System.Console.WriteLine("DrawerLayout:EventActions.Move");
break;
case EventActions.Up:
//System.Console.WriteLine($"DrawerLayout:EventActions.Down deltaX{deltaX} WWW:{mUIDrawerLayout.Frame.Size.Width} ");
if (Math.Abs(deltaX) >= mUIDrawerLayout.Frame.Size.Width / 2)
{
if (deltaX > 0)
{
//System.Console.WriteLine("DrawerOpen");
IsDrawerOpen = true;
ShowLeftView(IsDrawerOpen);
}
else
{
//System.Console.WriteLine("Drawer CLOSE");
IsDrawerOpen = false;
ShowLeftView(IsDrawerOpen);
}
}
else
{
ResetView();
}
//System.Console.WriteLine("DrawerLayout:EventActions.Up");
break;
}
}
private void moveWithPoint(CGPoint movePoint)
{
var x = movePoint.X;
deltaX = x - mLastX;
if (deltaX * deltaX > mTouchSlop * mTouchSlop)
{
//开始移动视图
if (IsDrawerOpen)
{
//MoveAction?.Invoke(deltaX);
MoveLeftView(deltaX);
}
else
{
if (mLastX < 10)
{
MoveLeftView(deltaX);
//从屏幕左侧开始滑动,才触发
//MoveAction?.Invoke(deltaX);
}
}
}
}
///
/// 垂直方向滚动视图
///
class MyUIDrawerLayout : UIView
{
public bool IsDrawerOpen = false;
public bool IsDrawerLockMode = false;
[Weak] internal UIDrawerLayout mUIDrawerLayout;
public MyUIDrawerLayout(UIDrawerLayout mUIDrawerLayout)
{
this.mUIDrawerLayout = mUIDrawerLayout;
}
///
/// 寻找最适合的View
/// 实现拦截
///
public override UIView HitTest(CGPoint point, UIEvent uievent)
{
if (!IsDrawerLockMode)//不锁定,允许右滑
{
if (PointInside(point, uievent))
{
if (IsDrawerOpen)//左菜单是否打开
{
if (point.X > this.Frame.Size.Width - 10)
{
//System.Console.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}");
return this;//拦截
}
}
else
{
if (point.X < 10)
{
//System.Console.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}");
return this; return this;//拦截
}
}
}
}
return base.HitTest(point, uievent);//不拦截
}
///
/// 点击开始
///
/// Touches.
/// Evt.
public override void TouchesBegan(NSSet touches, UIEvent evt)
{
//System.Console.WriteLine("MyUIDrawerLayout:TouchesBegan");
mUIDrawerLayout?.TouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this));
mUIDrawerLayout?.MYTouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this));
}
///
/// 移动
///
/// Touches.
/// Evt.
public override void TouchesMoved(NSSet touches, UIEvent evt)
{
mUIDrawerLayout?.TouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this));
mUIDrawerLayout?.MYTouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this));
}
///
/// 点击弹起
///
/// Touches.
/// Evt.
public override void TouchesEnded(NSSet touches, UIEvent evt)
{
mUIDrawerLayout?.TouchEvent(EventActions.Up, (touches.AnyObject as UITouch).LocationInView(this));
mUIDrawerLayout?.MYTouchEvent(EventActions.Up, (touches.AnyObject as UITouch).LocationInView(this));
//System.Console.WriteLine("MyUIDrawerLayout:TouchesEnded");
}
public override void TouchesCancelled(NSSet touches, UIEvent evt)
{
mUIDrawerLayout?.TouchEvent(EventActions.Cancel, (touches.AnyObject as UITouch).LocationInView(this));
mUIDrawerLayout?.MYTouchEvent(EventActions.Cancel, (touches.AnyObject as UITouch).LocationInView(this));
}
///
/// 框架默认加了两个UIImageView ,这样可以去掉默认添加
///
/// View.
public override void AddSubview(UIView view)
{
if (view.GetType() == typeof(UIImageView) && view.Tag != int.MinValue)
{
return;
}
base.AddSubview(view);
}
}
}
}