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; } } /// /// 左侧菜单View /// UIView leftView; /// /// 主菜单View /// UIView mainView; /// /// 蒙层遮挡View /// MyMaskUIView maskUIView; /// /// 构造函数 /// 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 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); } /// /// 刷新左View显示的位置 /// /// 最终view的位置 /// 是否需要平移动画 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.3); //UIView.SetAnimationDelegate(leftView); leftView.Frame = leftFrame; RefreshMaskUIViewBackgroundColor(leftView.Frame.X); UIView.CommitAnimations(); } } /// /// 刷新蒙层View的位置和透明度颜色 /// /// 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. public void AddLeftView(View view) { if (null == view) { return; } LeftViewRemoveAllViews(); view.Parent = this; leftChildView = view; var addFrame = leftView.Frame; addFrame.X = 0; addFrame.Y = 0; 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 isDrawerLockModei; public bool IsDrawerLockMode { get
 {
 return isDrawerLockModei;
 } set { isDrawerLockModei = value; mUIDrawerLayout.IsDrawerLockMode = isDrawerLockModei; } } 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); //Shared.HDLUtils.WriteLine("OpenLeftMenu-------"); } } /// /// 关闭抽屉view /// public void CloseLeftMenu() { if (IsDrawerOpen) { IsDrawerOpen = false; ShowLeftView(IsDrawerOpen); //Shared.HDLUtils.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; RefreshLeftViewFrame(mFrame); } /// /// 移动左边view /// public void MoveLeftView(nfloat moveX) { if (IsDrawerOpen) { if (moveX < 0) { var mFrame = leftView.Frame; mFrame.X = 0 + moveX; RefreshLeftViewFrame(mFrame,false); } } else { if (moveX > 0) { var mFrame = leftView.Frame; mFrame.X = -mUIDrawerLayout.Frame.Size.Width + moveX; RefreshLeftViewFrame(mFrame,false); } } } /// /// 重置左边view /// public void ResetView() { var mFrame = leftView.Frame; if (IsDrawerOpen) { mFrame.X = 0; //Shared.HDLUtils.WriteLine($"Reset Open"); } else { mFrame.X = -mUIDrawerLayout.Frame.Size.Width; //Shared.HDLUtils.WriteLine($"Reset CLOSE"); } RefreshLeftViewFrame(mFrame); } nfloat mLastX, mLastY, deltaX; int mTouchSlop = 3; private void MYTouchEvent(EventActions eventAction, CGPoint point) { if (isDrawerLockModei) return; switch (eventAction) { case EventActions.Down: //记录点击的最新X坐标 mLastX = point.X; mLastY = point.Y; //Shared.HDLUtils.WriteLine($"DrawerLayout:EventActions.Down XXX{mLastX}"); break; case EventActions.Move: moveWithPoint(point); //Shared.HDLUtils.WriteLine("DrawerLayout:EventActions.Move"); break; case EventActions.Up: //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) { IsDrawerOpen = true; ShowLeftView(IsDrawerOpen); } else { IsDrawerOpen = false; ShowLeftView(IsDrawerOpen); } } else { ResetView(); } 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); } } } } /// /// 垂直方向滚动视图 /// 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) { //Shared.HDLUtils.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}"); if (!IsDrawerLockMode)//不锁定,允许右滑 { if (PointInside(point, uievent)) { if (IsDrawerOpen)//左菜单是否打开 { if (point.X > this.Frame.Size.Width - 10) { //Shared.HDLUtils.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}"); return this;//拦截 } } else { if (point.X < 10) { //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);//不拦截 //} } /// /// 点击开始 /// /// Touches. /// Evt. public override void TouchesBegan(NSSet touches, UIEvent evt) { //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)); } /// /// 移动 /// /// 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)); //Shared.HDLUtils.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); } } /// /// 蒙层View /// class MyMaskUIView : UIView { public MyMaskUIView() { } /// /// 寻找最适合的View /// 实现拦截 /// public override UIView HitTest(CGPoint point, UIEvent uievent) { return null; } } } }