wxr
2020-06-15 b8e94316e41eba72d927d5ca7d931b26139ee8ff
Shared.IOS/UI/UIDrawerLayout.cs
@@ -28,8 +28,19 @@
            }
        }
        /// <summary>
        /// 左侧菜单View
        /// </summary>
        UIView leftView;
        /// <summary>
        /// 主菜单View
        /// </summary>
        UIView mainView;
        /// <summary>
        /// 蒙层遮挡View
        /// </summary>
        MyMaskUIView maskUIView;
        /// <summary>
        /// 构造函数
@@ -38,31 +49,75 @@
        {
            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;
@@ -80,19 +135,9 @@
            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);
@@ -111,32 +156,33 @@
            {
                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;
            }
@@ -147,17 +193,14 @@
        /// </summary>
        public void OpenLeftMenu()
        {
            if (!IsDrawerOpen)
            {
                IsDrawerOpen = true;
                ShowLeftView(IsDrawerOpen);
                //System.Console.WriteLine("OpenLeftMenu-------");
                //Shared.HDLUtils.WriteLine("OpenLeftMenu-------");
            }
       
        }
        /// <summary>
        /// 关闭抽屉view
@@ -168,7 +211,7 @@
            {
                IsDrawerOpen = false;
                ShowLeftView(IsDrawerOpen);
                //System.Console.WriteLine("CloseLeftMenu-------");
                //Shared.HDLUtils.WriteLine("CloseLeftMenu-------");
            }
        }
@@ -186,8 +229,6 @@
        //}
        /// <summary>
        /// 是否打开显示左边菜单view
        /// </summary>
@@ -195,30 +236,31 @@
        {
            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);
                }
            }
@@ -235,15 +277,15 @@
            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);
        }
@@ -252,7 +294,7 @@
        private void MYTouchEvent(EventActions eventAction, CGPoint point)
        {
            if (_IsDrawerLockMode) return;
            if (isDrawerLockModei) return;
            switch (eventAction)
            {
@@ -261,25 +303,23 @@
                    //记录点击的最新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);
                        }
@@ -289,7 +329,6 @@
                        ResetView();
                    }
                    //System.Console.WriteLine("DrawerLayout:EventActions.Up");
                    break;
            }
@@ -313,12 +352,7 @@
                    if (mLastX < 10)
                    {
                        MoveLeftView(deltaX);
                        //从屏幕左侧开始滑动,才触发
                        //MoveAction?.Invoke(deltaX);
                    }
                }
            }
@@ -339,8 +373,6 @@
            public MyUIDrawerLayout(UIDrawerLayout mUIDrawerLayout)
            {
                this.mUIDrawerLayout = mUIDrawerLayout;
            }
@@ -351,6 +383,8 @@
            public override UIView HitTest(CGPoint point, UIEvent uievent)
            {
                //Shared.HDLUtils.WriteLine($"MyUIDrawerLayout:HitTest{point.X}   uievent{uievent.ToString()}");
                if (!IsDrawerLockMode)//不锁定,允许右滑
                {
                    if (PointInside(point, uievent))
@@ -359,7 +393,7 @@
                        {
                            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;//拦截
                            }
@@ -368,8 +402,8 @@
                        {
                            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;
                            }
                        }
@@ -377,6 +411,17 @@
                }
                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);//不拦截
                //}
            }
@@ -387,7 +432,7 @@
            /// <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));
                
@@ -412,7 +457,7 @@
            {
                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)
@@ -432,9 +477,32 @@
                }
                base.AddSubview(view);
            }
        }
        /// <summary>
        /// 蒙层View
        /// </summary>
        class MyMaskUIView : UIView
        {
            public MyMaskUIView()
            {
        }
            /// <summary>
            /// 寻找最适合的View
            /// 实现拦截
            /// </summary>
            public override UIView HitTest(CGPoint point, UIEvent uievent)
            {
                return null;
            }
        }
    }
}