From 06696e6f225733a60b03eea4a7c6374053d92c1d Mon Sep 17 00:00:00 2001
From: wxr <464027401@qq.com>
Date: 星期二, 14 四月 2020 14:15:35 +0800
Subject: [PATCH] 20200414

---
 Shared.IOS/UI/RowLayout.cs |  506 ++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 402 insertions(+), 104 deletions(-)

diff --git a/Shared.IOS/UI/RowLayout.cs b/Shared.IOS/UI/RowLayout.cs
index 7217085..252761d 100644
--- a/Shared.IOS/UI/RowLayout.cs
+++ b/Shared.IOS/UI/RowLayout.cs
@@ -6,101 +6,339 @@
 
 namespace Shared
 {
-	/// <summary>
-	/// 鍦ㄦ粦鍔ㄤ簨浠朵笅锛屽彲鏄剧ず闅愯棌浜涜嚜瀹氫箟瑙嗗浘
-	/// </summary>
-	public class RowLayout : ViewGroup
-	{
-		/// <summary>
-		/// 鍙宠竟鐨勮鍥惧垪琛�
-		/// </summary>
-		internal System.Collections.Generic.List<Button> leftView = new System.Collections.Generic.List<Button>();
-		/// <summary>
-		/// 鍙宠竟鐨勮鍥惧垪琛�
-		/// </summary>
-		internal System.Collections.Generic.List<Button> rigthView = new System.Collections.Generic.List<Button>();
+    /// <summary>
+    /// 鍦ㄦ粦鍔ㄤ簨浠朵笅锛屽彲鏄剧ず闅愯棌浜涜嚜瀹氫箟瑙嗗浘
+    /// </summary>
+    public class RowLayout : ViewGroup
+    {
+        ///// <summary>
+        ///// OpenLeftMenuAction
+        ///// </summary>
+        //public Action OpenLeftMenuAction;
+        ///// <summary>
+        ///// OpenRightMenuAction
+        ///// </summary>
+        //public Action OpenRightMenuAction;
 
-		/// <summary>
-		/// 閲嶆柊鍒锋柊鎺т欢
-		/// </summary>
-		public override void Refresh()
-		{
-			base.Refresh();
-		}
-		/// <summary>
-		/// 鎺т欢瀹藉害
-		/// </summary>
-		public override int Width
-		{
-			get
-			{
-				return base.Width;
-			}
+        /// <summary>
+        /// OpenMenuAction
+        /// </summary>
+        public Action OpenMenuAction;
+
+
+        /// <summary>
+        /// 鍙宠竟鐨勮鍥惧垪琛�
+        /// </summary>
+        internal System.Collections.Generic.List<Button> leftView = new System.Collections.Generic.List<Button>();
+        /// <summary>
+        /// 鍙宠竟鐨勮鍥惧垪琛�
+        /// </summary>
+        internal System.Collections.Generic.List<Button> rigthView = new System.Collections.Generic.List<Button>();
+        /// <summary>
+        /// 涓嬮潰閭h竟寮�
+        /// </summary>
+        UIView lineUIView = new UIView();
+
+        /// <summary>
+        /// 閲嶆柊鍒锋柊鎺т欢
+        /// </summary>
+        public override void Refresh()
+        {
+            base.Refresh();
+            LineColor = lineColor;
+        }
+        /// <summary>
+        /// 鎺т欢瀹藉害
+        /// </summary>
+        public override int Width
+        {
+            get
+            {
+                return base.Width;
+            }
             set
             {
                 base.Width = value;
                 if (!IsCanRefresh)
                     return;
+
+                var frame4 = lineUIView.Frame;
+                frame4.Width = base.Width;
+                lineUIView.Frame = frame4;
             }
-		}
+        }
 
-		/// <summary>
-		/// 瀛愯鍥剧殑瀹藉害
-		/// </summary>
-		public int SubViewWidth = 70;
+        /// <summary>
+        /// 瀛愯鍥剧殑瀹藉害
+        /// </summary>
+        public int SubViewWidth = 70;
 
-		/// <summary>
-		/// 鎺т欢鐨勯珮搴�
-		/// </summary>
-		/// <value>The height.</value>
-		public override int Height
-		{
-			get
-			{
-				return base.Height;
-			}
-			set
-			{
-				base.Height = value;
-				if (!IsCanRefresh)
-					return;
+        /// <summary>
+        /// 鎺т欢鐨勯珮搴�
+        /// </summary>
+        /// <value>The height.</value>
+        public override int Height
+        {
+            get
+            {
+                return base.Height;
+            }
+            set
+            {
+                base.Height = value;
+                if (!IsCanRefresh)
+                    return;
 
-				{
-					var frame = realViewGroup.Frame;
-					frame.Height = Height;
-					realViewGroup.Frame = frame;
-				}
-			}
-		}
+                {
+                    var frame = realViewGroup.Frame;
+                    frame.Height = Height;
+                    realViewGroup.Frame = frame;
+                }
 
-		/// <summary>
-		/// 澧炲姞宸﹁竟瑙嗗浘
-		/// </summary>
-		/// <param name="view">View.</param>
-		public void AddLeftView(Button view)
-		{
-			if (null == view)
-			{
-				return;
-			}
-			view.X = leftView.Count * SubViewWidth;
-			view.Y = 0;
-			view.Width = SubViewWidth;
-			view.Height = Height;
-			viewGroup.AddSubview(view.RealView);
-			view.Parent = this;
-			view.Refresh();
-			leftView.Add(view);
-			var frame = realViewGroup.Frame;
-			frame.X += SubViewWidth;
-			realViewGroup.Frame = frame;
-			foreach (var right in rigthView)
-			{
-				right.X += SubViewWidth;
-			}
-			(viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize((leftView.Count + rigthView.Count) * SubViewWidth + realViewGroup.Frame.Width, 0);
-			(viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false);
-		}
+                var frame4 = lineUIView.Frame;
+                frame4.Y = base.Height - frame4.Height;
+                lineUIView.Frame = frame4;
+            }
+        }
+
+        uint lineColor = 0x80818181;
+        /// <summary>
+        /// 鑳屾櫙棰滆壊
+        /// </summary>
+        /// <value>The color of the background.</value>
+        public virtual uint LineColor
+        {
+            get
+            {
+                return lineColor;
+            }
+            set
+            {
+                lineColor = value;
+                if (!IsCanRefresh)
+                {
+                    return;
+                }
+                byte r, g, b, a;
+                r = (byte)(lineColor / 256 / 256 % 256);
+                g = (byte)(lineColor / 256 % 256);
+                b = (byte)(lineColor % 256);
+                a = (byte)(lineColor / 256 / 256 / 256 % 256);
+                lineUIView.BackgroundColor = UIKit.UIColor.FromRGBA(r, g, b, a);
+            }
+        }
+
+        /// <summary>
+        /// 鏄惁姝f墦寮�
+        /// </summary>
+        //public bool IsOpening;
+        public bool IsShowLeft;
+        public bool IsShowRight;
+
+        /// <summary>
+        /// 鍏抽棴鍏朵粬RowLayout 鏄剧ず鐨刅iew
+        /// </summary>
+        private void HideOtherRowLayout()
+        {
+            try
+            {
+                if (this.Parent != null)
+                {
+                    foreach (View mView in Parent.viewList)
+                    {
+                        if (mView is RowLayout && mView != this)
+                        {
+
+                            if ((mView as RowLayout).IsShowRight || (mView as RowLayout).IsShowLeft)
+                            {
+                                (mView as RowLayout).HideMenu();
+                            }
+                        }
+                    }
+
+                }
+            }
+            catch
+            {
+            }
+        }
+
+        /// <summary>
+        /// 鍏抽棴鏄剧ず鐨刅iew
+        /// </summary>
+        public void HideMenu()
+        {
+            if (IsShowLeft)
+            {
+                HideLeftMenu();
+            }
+            if (IsShowRight)
+            {
+                HideRightMenu();
+            }
+
+        }
+
+        public void OpenLeftMenu()
+        {
+            HideOtherRowLayout();
+            if (IsShowRight)
+            {
+                HideRightMenu();
+                return;
+            }
+
+            if (leftView.Count == 0)
+                return;
+
+
+            IsShowLeft = true;
+            (viewGroup as UIScrollView).SetContentOffset(new CGPoint(leftView[0].RealView.Frame.X, 0), false);
+            OpenMenuAction?.Invoke();
+        }
+
+        public void HideLeftMenu()
+        {
+            IsShowLeft = false;
+            HideAllMenuView();
+        }
+
+        public void OpenRightMenu()
+        {
+            HideOtherRowLayout();
+            if (IsShowLeft)
+            {
+                HideLeftMenu();
+                return;
+            }
+            if (rigthView.Count == 0)
+                return;
+            IsShowRight = true;
+            var rigthViewX = realViewGroup.Frame.X + GetAllRightViewWidth();
+            (viewGroup as UIScrollView).SetContentOffset(new CGPoint(rigthViewX, 0), false);
+            OpenMenuAction?.Invoke();
+
+        }
+
+        public void HideRightMenu()
+        {
+            IsShowRight = false;
+
+            HideAllMenuView();
+        }
+
+        void RestMenuView()
+        {
+            if (IsShowRight)
+            {
+                OpenRightMenu();
+            }
+            else if (IsShowLeft)
+            {
+                OpenLeftMenu();
+
+            }
+            else
+            {
+                HideAllMenuView();
+            }
+
+        }
+
+        void HideAllMenuView()
+        {
+            (viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), true);
+        }
+
+        /// <summary>
+        /// 鏄惁浣跨敤鍚屾牱鐨凷ubViewWidth瀹� 
+        /// </summary>
+        bool isUseSameSubViewWidth = true;
+        public bool IsUseSameSubViewWidth
+        {
+            get
+            {
+                return isUseSameSubViewWidth;
+
+            }
+            set
+            {
+                isUseSameSubViewWidth = value;
+            }
+
+        }
+
+        /// <summary>
+        /// 鑾峰彇褰撳墠leftView鐨勬�诲
+        /// </summary>
+        /// <returns></returns>
+        int GetAllLeftViewWidth()
+        {
+            int mWidth = 0;
+            foreach (var mView in leftView)
+            {
+                mWidth += mView.Width;
+            }
+            return mWidth;
+        }
+
+        /// <summary>
+        /// 鑾峰彇褰撳墠rigthView鐨勬�诲
+        /// </summary>
+        /// <returns></returns>
+        int GetAllRightViewWidth()
+        {
+            int mWidth = 0;
+            foreach (var mView in rigthView)
+            {
+                mWidth += mView.Width;
+            }
+            return mWidth;
+        }
+
+
+        /// <summary>
+        /// 澧炲姞宸﹁竟瑙嗗浘
+        /// </summary>
+        /// <param name="view">View.</param>
+        public void AddLeftView(Button view)
+        {
+            if (null == view)
+            {
+                return;
+            }
+
+            var mSubViewWidth = isUseSameSubViewWidth ? SubViewWidth : view.Width;
+
+            view.X = GetAllLeftViewWidth();
+            view.Y = 0;
+            view.Width = mSubViewWidth;
+            view.Height = Height;
+            viewGroup.AddSubview(view.RealView);
+            view.Parent = this;
+            view.Refresh();
+            leftView.Add(view);
+            var frame = realViewGroup.Frame;
+            frame.X += mSubViewWidth;
+            realViewGroup.Frame = frame;
+            foreach (var right in rigthView)
+            {
+                right.X += mSubViewWidth;
+            }
+
+            RefreshContentSize();
+
+            //         var menuWidth = GetAllLeftViewWidth() + GetAllRightViewWidth();
+            //         (viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize(menuWidth + realViewGroup.Frame.Width, 0);
+            //(viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false);
+        }
+
+        void RefreshContentSize()
+        {
+            var menuWidth = GetAllLeftViewWidth() + GetAllRightViewWidth();
+            (viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize(menuWidth + realViewGroup.Frame.Width, 0);
+            (viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false);
+        }
 
         internal override void removeChildParent()
         {
@@ -120,39 +358,99 @@
         /// </summary>
         /// <param name="view">View.</param>
         public void AddRightView(Button view)
-		{
-           if (null == view)
-			{
-				return;
-			}
-			view.X =(int)realViewGroup.Frame.Right+ rigthView.Count * SubViewWidth;
-			view.Y = 0;
-			view.Width = SubViewWidth;
-			view.Height = Height;
-			viewGroup.AddSubview(view.RealView);
-			view.Parent = this;
-			view.Refresh();
-			rigthView.Add(view);
+        {
+            if (null == view)
+            {
+                return;
+            }
+            var mSubViewWidth = isUseSameSubViewWidth ? SubViewWidth : view.Width;
 
-			(viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize((leftView.Count + rigthView.Count) * SubViewWidth + realViewGroup.Frame.Width, 0);
-			(viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false);
+            view.X = (int)realViewGroup.Frame.Right + GetAllRightViewWidth();
+            view.Y = 0;
+            view.Width = mSubViewWidth;
+            view.Height = Height;
+            viewGroup.AddSubview(view.RealView);
+            view.Parent = this;
+            view.Refresh();
+            rigthView.Add(view);
 
-		}
+            RefreshContentSize();
 
+            //         (viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize((leftView.Count + rigthView.Count) * SubViewWidth + realViewGroup.Frame.Width, 0);
+            //(viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false);
+
+        }
+
+        nfloat beforeXScrollX;
+        nfloat moveX;
         /// <summary>
         /// 鍦ㄦ粦鍔ㄤ簨浠朵笅锛屽彲鏄剧ず闅愯棌浜涜嚜瀹氫箟瑙嗗浘
         /// </summary>
         public RowLayout()
-		{
+        {
             viewGroup = new UIScrollView { Bounces = false };
             realViewGroup = new MyRowLayout(this) { };
-            
-			viewGroup.AddSubview(realViewGroup);
-			viewGroup.Layer.MasksToBounds = true;
+
+            viewGroup.AddSubview(realViewGroup);
+            viewGroup.Layer.MasksToBounds = true;
+
+            lineUIView.BackgroundColor = new UIColor(0x81 / 255.0f, 0x81 / 255.0f, 0x81 / 255.0f, 0.8f);
+            var lineUIViewFrame = lineUIView.Frame;
+            lineUIViewFrame.Height = 1.0f;
+            lineUIView.Frame = lineUIViewFrame;
+            viewGroup.AddSubview(lineUIView);
 
             (viewGroup as UIScrollView).ShowsHorizontalScrollIndicator = false;//闅愯棌姘村钩婊氬姩鏉�
+
+
+            (viewGroup as UIScrollView).Scrolled += (s, e) =>
+            {
+                moveX = (viewGroup as UIScrollView).ContentOffset.X - beforeXScrollX;
+            };
+
+            (viewGroup as UIScrollView).DraggingStarted += (sender, e) =>
+            {
+                beforeXScrollX = (viewGroup as UIScrollView).ContentOffset.X;
+            };
+
+            (viewGroup as UIScrollView).DecelerationStarted += (s, e) =>
+            {
+
+                GetMovePageIndex();
+
+            };
+
+
+
+            (viewGroup as UIScrollView).DraggingEnded += (s, e) =>
+            {
+                if (!e.Decelerate)
+                {
+                    GetMovePageIndex();
+                }
+            };
+
         }
 
+        void GetMovePageIndex()
+        {
+
+            if (20 < Math.Abs(moveX))
+            {
+                if (moveX < 0)
+                {
+                    OpenLeftMenu();
+                }
+                else if (moveX > 0)
+                {
+                    OpenRightMenu();
+                }
+            }
+            else
+            {
+                RestMenuView();
+            }
+        }
 
 
         /// <summary>

--
Gitblit v1.8.0