| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 左侧菜单View |
| | | /// </summary> |
| | | UIView leftView; |
| | | /// <summary> |
| | | /// 主菜单View |
| | | /// </summary> |
| | | UIView mainView; |
| | | /// <summary> |
| | | /// 蒙层遮挡View |
| | | /// </summary> |
| | | MyMaskUIView maskUIView; |
| | | |
| | | |
| | | /// <summary> |
| | | /// 构造函数 |
| | |
| | | { |
| | | |
| | | 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; |
| | | var leftViewFrame = leftView.Frame; |
| | | leftViewFrame.Y = 0; |
| | | leftViewFrame.X = 0; |
| | | leftViewFrame.Width = Application.CurrentWidth; |
| | | leftViewFrame.Height = Application.CurrentHeight; |
| | | leftViewFrame.X = -Application.CurrentWidth; |
| | | leftView.Frame = leftViewFrame; |
| | | leftView.BackgroundColor = UIColor.FromRGBA(0, 0, 0, 99); |
| | | |
| | | viewGroup.AddSubview(leftView); |
| | | |
| | | maskUIView = new MyMaskUIView(); |
| | | var maskFrame = maskUIView.Frame; |
| | | maskFrame.Y = 0; |
| | | maskFrame.X = 0; |
| | | maskFrame.Width = Application.CurrentWidth; |
| | | maskFrame.Height = Application.CurrentHeight; |
| | | maskUIView.Frame = maskFrame; |
| | | maskUIView.BackgroundColor = UIColor.FromRGBA(0, 0, 0, 0); |
| | | viewGroup.AddSubview(maskUIView); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 刷新左View显示的位置 |
| | | /// </summary> |
| | | /// <param name="leftFrame">最终view的位置</param> |
| | | /// <param name="needAnimations">是否需要平移动画</param> |
| | | void RefreshLeftViewFrame(CGRect leftFrame, bool needAnimations = true) |
| | | { |
| | | //leftView.Frame = leftFrame; |
| | | //RefreshMaskUIViewBackgroundColor(leftView.Frame.X); |
| | | |
| | | //2020-06-11 增加平移动画 |
| | | if (!needAnimations) |
| | | { |
| | | leftView.Frame = leftFrame; |
| | | RefreshMaskUIViewBackgroundColor(leftView.Frame.X); |
| | | } |
| | | else |
| | | { |
| | | UIView.BeginAnimations("move"); |
| | | UIView.SetAnimationDuration(0.5); |
| | | //UIView.SetAnimationDelegate(leftView); |
| | | leftView.Frame = leftFrame; |
| | | RefreshMaskUIViewBackgroundColor(leftView.Frame.X); |
| | | UIView.CommitAnimations(); |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 刷新蒙层View的位置和透明度颜色 |
| | | /// </summary> |
| | | /// <param name="leftViewX"></param> |
| | | void RefreshMaskUIViewBackgroundColor(nfloat leftViewX) |
| | | { |
| | | int alpha = 180 + (int)(leftViewX / mUIDrawerLayout.Frame.Size.Width * 180); |
| | | maskUIView.BackgroundColor = UIColor.FromRGBA(0, 0, 0, alpha); |
| | | var maskFrame = maskUIView.Frame; |
| | | maskFrame.X = leftView.Frame.X + leftView.Frame.Width; |
| | | maskUIView.Frame = maskFrame; |
| | | } |
| | | |
| | | |
| | | View leftChildView; |
| | |
| | | |
| | | 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); |
| | | |
| | |
| | | { |
| | | leftChildView.RealView.RemoveFromSuperview(); |
| | | } |
| | | |
| | | leftChildView.Parent = null; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 是否锁定右滑功能, 锁定后右滑弹出菜单失效 |
| | | /// </summary> |
| | | bool _IsDrawerLockMode; |
| | | bool isDrawerLockModei; |
| | | public bool IsDrawerLockMode |
| | | { |
| | | get
{
return _IsDrawerLockMode;
} |
| | | get
{
return isDrawerLockModei;
} |
| | | set |
| | | { |
| | | _IsDrawerLockMode = value; |
| | | mUIDrawerLayout.IsDrawerLockMode = _IsDrawerLockMode; |
| | | isDrawerLockModei = value; |
| | | mUIDrawerLayout.IsDrawerLockMode = isDrawerLockModei; |
| | | } |
| | | } |
| | | |
| | | bool _IsDrawerOpen = false; |
| | | bool isDrawerOpen = false; |
| | | |
| | | private bool IsDrawerOpen |
| | | { |
| | | get
{
return _IsDrawerOpen;
} |
| | | get
{
return isDrawerOpen;
} |
| | | set |
| | | { |
| | | _IsDrawerOpen = value; |
| | | mUIDrawerLayout.IsDrawerOpen = _IsDrawerOpen; |
| | | isDrawerOpen = value; |
| | | mUIDrawerLayout.IsDrawerOpen = isDrawerOpen; |
| | | |
| | | |
| | | } |
| | |
| | | /// </summary> |
| | | public void OpenLeftMenu() |
| | | { |
| | | |
| | | if (!IsDrawerOpen) |
| | | { |
| | | IsDrawerOpen = true; |
| | | ShowLeftView(IsDrawerOpen); |
| | | //System.Console.WriteLine("OpenLeftMenu-------"); |
| | | //Shared.HDLUtils.WriteLine("OpenLeftMenu-------"); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 关闭抽屉view |
| | |
| | | { |
| | | IsDrawerOpen = false; |
| | | ShowLeftView(IsDrawerOpen); |
| | | //System.Console.WriteLine("CloseLeftMenu-------"); |
| | | //Shared.HDLUtils.WriteLine("CloseLeftMenu-------"); |
| | | } |
| | | } |
| | | |
| | |
| | | //} |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 是否打开显示左边菜单view |
| | | /// </summary> |
| | |
| | | { |
| | | var mFrame = leftView.Frame; |
| | | mFrame.X = bShow ? 0 : -mUIDrawerLayout.Frame.Size.Width; |
| | | leftView.Frame = mFrame; |
| | | RefreshLeftViewFrame(mFrame); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 移动左边view |
| | | /// </summary> |
| | | public void MoveLeftView(nfloat XX) |
| | | public void MoveLeftView(nfloat moveX) |
| | | { |
| | | if (IsDrawerOpen) |
| | | { |
| | | if (XX < 0) |
| | | if (moveX < 0) |
| | | { |
| | | var mFrame = leftView.Frame; |
| | | mFrame.X = 0 + XX; |
| | | leftView.Frame = mFrame; |
| | | mFrame.X = 0 + moveX; |
| | | RefreshLeftViewFrame(mFrame,false); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if(XX > 0) |
| | | if (moveX > 0) |
| | | { |
| | | var mFrame = leftView.Frame; |
| | | mFrame.X = -mUIDrawerLayout.Frame.Size.Width + XX; |
| | | leftView.Frame = mFrame; |
| | | mFrame.X = -mUIDrawerLayout.Frame.Size.Width + moveX; |
| | | RefreshLeftViewFrame(mFrame,false); |
| | | } |
| | | |
| | | } |
| | |
| | | if (IsDrawerOpen) |
| | | { |
| | | mFrame.X = 0; |
| | | //System.Console.WriteLine($"Reset Open"); |
| | | //Shared.HDLUtils.WriteLine($"Reset Open"); |
| | | } |
| | | else |
| | | { |
| | | mFrame.X = -mUIDrawerLayout.Frame.Size.Width; |
| | | //System.Console.WriteLine($"Reset CLOSE"); |
| | | //Shared.HDLUtils.WriteLine($"Reset CLOSE"); |
| | | } |
| | | |
| | | leftView.Frame = mFrame; |
| | | RefreshLeftViewFrame(mFrame); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | private void MYTouchEvent(EventActions eventAction, CGPoint point) |
| | | { |
| | | if (_IsDrawerLockMode) return; |
| | | if (isDrawerLockModei) return; |
| | | |
| | | switch (eventAction) |
| | | { |
| | |
| | | //记录点击的最新X坐标 |
| | | mLastX = point.X; |
| | | mLastY = point.Y; |
| | | //System.Console.WriteLine($"DrawerLayout:EventActions.Down XXX{mLastX}"); |
| | | //Shared.HDLUtils.WriteLine($"DrawerLayout:EventActions.Down XXX{mLastX}"); |
| | | break; |
| | | case EventActions.Move: |
| | | moveWithPoint(point); |
| | | //System.Console.WriteLine("DrawerLayout:EventActions.Move"); |
| | | //Shared.HDLUtils.WriteLine("DrawerLayout:EventActions.Move"); |
| | | break; |
| | | case EventActions.Up: |
| | | //System.Console.WriteLine($"DrawerLayout:EventActions.Down deltaX{deltaX} WWW:{mUIDrawerLayout.Frame.Size.Width} "); |
| | | //Shared.HDLUtils.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); |
| | | } |
| | |
| | | ResetView(); |
| | | |
| | | } |
| | | //System.Console.WriteLine("DrawerLayout:EventActions.Up"); |
| | | break; |
| | | |
| | | } |
| | |
| | | if (mLastX < 10) |
| | | { |
| | | MoveLeftView(deltaX); |
| | | //从屏幕左侧开始滑动,才触发 |
| | | //MoveAction?.Invoke(deltaX); |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | public MyUIDrawerLayout(UIDrawerLayout mUIDrawerLayout) |
| | | { |
| | | this.mUIDrawerLayout = mUIDrawerLayout; |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | |
| | | public override UIView HitTest(CGPoint point, UIEvent uievent) |
| | | { |
| | | |
| | | //Shared.HDLUtils.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}"); |
| | | |
| | | if (!IsDrawerLockMode)//不锁定,允许右滑 |
| | | { |
| | | if (PointInside(point, uievent)) |
| | |
| | | { |
| | | if (point.X > this.Frame.Size.Width - 10) |
| | | { |
| | | //System.Console.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}"); |
| | | //Shared.HDLUtils.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}"); |
| | | return this;//拦截 |
| | | } |
| | | |
| | |
| | | { |
| | | if (point.X < 10) |
| | | { |
| | | //System.Console.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}"); |
| | | return this; return this;//拦截 |
| | | //Shared.HDLUtils.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}"); |
| | | return this; |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | return base.HitTest(point, uievent);//不拦截 |
| | | |
| | | //UIView viewReturn = base.HitTest(point, uievent); |
| | | //if (viewReturn is MyUIDrawerLayout) |
| | | //{ |
| | | // return base.HitTest(point, uievent);//不拦截 |
| | | //} |
| | | //else { |
| | | |
| | | |
| | | // return base.HitTest(point, uievent);//不拦截 |
| | | //} |
| | | } |
| | | |
| | | |
| | |
| | | /// <param name="evt">Evt.</param> |
| | | public override void TouchesBegan(NSSet touches, UIEvent evt) |
| | | { |
| | | //System.Console.WriteLine("MyUIDrawerLayout:TouchesBegan"); |
| | | //Shared.HDLUtils.WriteLine("MyUIDrawerLayout:TouchesBegan"); |
| | | mUIDrawerLayout?.TouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this)); |
| | | mUIDrawerLayout?.MYTouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this)); |
| | | |
| | |
| | | { |
| | | 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"); |
| | | //Shared.HDLUtils.WriteLine("MyUIDrawerLayout:TouchesEnded"); |
| | | } |
| | | |
| | | public override void TouchesCancelled(NSSet touches, UIEvent evt) |
| | |
| | | } |
| | | base.AddSubview(view); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 蒙层View |
| | | /// </summary> |
| | | class MyMaskUIView : UIView |
| | | { |
| | | public MyMaskUIView() |
| | | { |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 寻找最适合的View |
| | | /// 实现拦截 |
| | | /// </summary> |
| | | public override UIView HitTest(CGPoint point, UIEvent uievent) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | } |