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); } } } }