using System; 
 | 
using CoreAnimation; 
 | 
using CoreGraphics; 
 | 
using Foundation; 
 | 
using UIKit; 
 | 
  
 | 
  
 | 
  
 | 
namespace Shared 
 | 
{ 
 | 
    /// <summary> 
 | 
    /// 右滑抽屉View 
 | 
    /// </summary> 
 | 
    public class UIDrawerLayout : ViewGroup 
 | 
    { 
 | 
        /// <summary> 
 | 
        ///  当前视图 
 | 
        /// </summary> 
 | 
        /// <value>The UICoverFlowView.</value> 
 | 
        MyUIDrawerLayout mUIDrawerLayout 
 | 
        { 
 | 
            get 
 | 
            { 
 | 
                return uiView as MyUIDrawerLayout; 
 | 
            } 
 | 
            set 
 | 
            { 
 | 
                uiView = value; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        UIView leftView; 
 | 
        UIView mainView; 
 | 
  
 | 
        /// <summary> 
 | 
        /// 构造函数 
 | 
        /// </summary> 
 | 
        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; 
 | 
        /// <summary> 
 | 
        /// 增加左边视图 
 | 
        /// </summary> 
 | 
        /// <param name="view">View.</param> 
 | 
        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); 
 | 
  
 | 
        } 
 | 
  
 | 
  
 | 
        /// <summary> 
 | 
        /// RemoveLeftView 
 | 
        /// </summary> 
 | 
        public void LeftViewRemoveAllViews() 
 | 
        { 
 | 
            if (leftChildView == null) return; 
 | 
  
 | 
  
 | 
            if (leftChildView.RealView.Superview != null) 
 | 
            { 
 | 
                leftChildView.RealView.RemoveFromSuperview(); 
 | 
            } 
 | 
            leftChildView.Parent = null; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 是否锁定右滑功能, 锁定后右滑弹出菜单失效 
 | 
        /// </summary> 
 | 
        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; 
 | 
  
 | 
  
 | 
            } 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 打开抽屉view 
 | 
        /// </summary> 
 | 
        public void OpenLeftMenu() 
 | 
        { 
 | 
  
 | 
            if (!IsDrawerOpen) 
 | 
            { 
 | 
                IsDrawerOpen = true; 
 | 
                ShowLeftView(IsDrawerOpen); 
 | 
                System.Console.WriteLine("OpenLeftMenu-------"); 
 | 
            } 
 | 
        
 | 
        } 
 | 
  
 | 
  
 | 
  
 | 
        /// <summary> 
 | 
        /// 关闭抽屉view 
 | 
        /// </summary> 
 | 
        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; 
 | 
        //} 
 | 
  
 | 
  
 | 
  
 | 
  
 | 
        /// <summary> 
 | 
        /// 是否打开显示左边菜单view 
 | 
        /// </summary> 
 | 
        private void ShowLeftView(bool bShow) 
 | 
        { 
 | 
            var mFrame = leftView.Frame; 
 | 
            mFrame.X = bShow ? 0 : -mUIDrawerLayout.Frame.Size.Width; 
 | 
            leftView.Frame = mFrame; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 移动左边view 
 | 
        /// </summary> 
 | 
        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; 
 | 
                } 
 | 
  
 | 
            } 
 | 
        } 
 | 
  
 | 
  
 | 
        /// <summary> 
 | 
        /// 重置左边view 
 | 
        /// </summary> 
 | 
        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); 
 | 
  
 | 
                    } 
 | 
  
 | 
  
 | 
                } 
 | 
  
 | 
            } 
 | 
  
 | 
        } 
 | 
  
 | 
  
 | 
        /// <summary> 
 | 
        /// 垂直方向滚动视图 
 | 
        /// </summary> 
 | 
        class MyUIDrawerLayout : UIView 
 | 
        { 
 | 
            public bool IsDrawerOpen = false; 
 | 
            public bool IsDrawerLockMode = false; 
 | 
  
 | 
            [Weak] internal UIDrawerLayout mUIDrawerLayout; 
 | 
  
 | 
            public MyUIDrawerLayout(UIDrawerLayout mUIDrawerLayout) 
 | 
            { 
 | 
                this.mUIDrawerLayout = mUIDrawerLayout; 
 | 
  
 | 
  
 | 
            } 
 | 
  
 | 
  
 | 
            /// <summary> 
 | 
            /// 寻找最适合的View 
 | 
            /// 实现拦截 
 | 
            /// </summary> 
 | 
            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);//不拦截 
 | 
            } 
 | 
  
 | 
  
 | 
            /// <summary> 
 | 
            /// 点击开始 
 | 
            /// </summary> 
 | 
            /// <param name="touches">Touches.</param> 
 | 
            /// <param name="evt">Evt.</param> 
 | 
            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)); 
 | 
                 
 | 
            } 
 | 
            /// <summary> 
 | 
            ///  移动 
 | 
            /// </summary> 
 | 
            /// <param name="touches">Touches.</param> 
 | 
            /// <param name="evt">Evt.</param> 
 | 
            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)); 
 | 
            } 
 | 
  
 | 
            /// <summary> 
 | 
            /// 点击弹起 
 | 
            /// </summary> 
 | 
            /// <param name="touches">Touches.</param> 
 | 
            /// <param name="evt">Evt.</param> 
 | 
            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)); 
 | 
            } 
 | 
            /// <summary> 
 | 
            /// 框架默认加了两个UIImageView ,这样可以去掉默认添加 
 | 
            /// </summary> 
 | 
            /// <param name="view">View.</param> 
 | 
            public override void AddSubview(UIView view) 
 | 
            { 
 | 
                if (view.GetType() == typeof(UIImageView) && view.Tag != int.MinValue) 
 | 
                { 
 | 
                    return; 
 | 
                } 
 | 
                base.AddSubview(view); 
 | 
            } 
 | 
  
 | 
  
 | 
  
 | 
        } 
 | 
    } 
 | 
} 
 |