From 767e3abed9c1e9a831a90357ee046a24b3a161b9 Mon Sep 17 00:00:00 2001
From: 陈嘉乐 <cjl@hdlchina.com.cn>
Date: 星期二, 14 七月 2020 17:21:49 +0800
Subject: [PATCH] 2020-07-14-3

---
 Shared.IOS/UI/RowLayout.cs |  323 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 299 insertions(+), 24 deletions(-)

diff --git a/Shared.IOS/UI/RowLayout.cs b/Shared.IOS/UI/RowLayout.cs
index 7217085..558a638 100644
--- a/Shared.IOS/UI/RowLayout.cs
+++ b/Shared.IOS/UI/RowLayout.cs
@@ -11,14 +11,23 @@
 	/// </summary>
 	public class RowLayout : ViewGroup
 	{
-		/// <summary>
-		/// 鍙宠竟鐨勮鍥惧垪琛�
-		/// </summary>
-		internal System.Collections.Generic.List<Button> leftView = new System.Collections.Generic.List<Button>();
+        /// <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>
 		/// 閲嶆柊鍒锋柊鎺т欢
@@ -26,6 +35,7 @@
 		public override void Refresh()
 		{
 			base.Refresh();
+			LineColor = lineColor;
 		}
 		/// <summary>
 		/// 鎺т欢瀹藉害
@@ -36,12 +46,16 @@
 			{
 				return base.Width;
 			}
-            set
-            {
-                base.Width = value;
-                if (!IsCanRefresh)
-                    return;
-            }
+			set
+			{
+				base.Width = value;
+				if (!IsCanRefresh)
+					return;
+
+				var frame4 = lineUIView.Frame;
+				frame4.Width = base.Width;
+				lineUIView.Frame = frame4;
+			}
 		}
 
 		/// <summary>
@@ -70,37 +84,243 @@
 					frame.Height = Height;
 					realViewGroup.Frame = frame;
 				}
+
+				var frame4 = lineUIView.Frame;
+				frame4.Y = base.Height - frame4.Height;
+				lineUIView.Frame = frame4;
 			}
 		}
 
+		uint lineColor = 0x80818181;
 		/// <summary>
-		/// 澧炲姞宸﹁竟瑙嗗浘
+		/// 鑳屾櫙棰滆壊
 		/// </summary>
-		/// <param name="view">View.</param>
-		public void AddLeftView(Button view)
+		/// <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), true);
+            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), true);
+            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;
 			}
-			view.X = leftView.Count * SubViewWidth;
+
+            var mSubViewWidth = isUseSameSubViewWidth ? SubViewWidth : view.Width;
+
+            view.X = GetAllLeftViewWidth();
 			view.Y = 0;
-			view.Width = SubViewWidth;
+			view.Width = mSubViewWidth;
 			view.Height = Height;
 			viewGroup.AddSubview(view.RealView);
 			view.Parent = this;
 			view.Refresh();
 			leftView.Add(view);
 			var frame = realViewGroup.Frame;
-			frame.X += SubViewWidth;
+			frame.X += mSubViewWidth;
 			realViewGroup.Frame = frame;
 			foreach (var right in rigthView)
 			{
-				right.X += SubViewWidth;
+				right.X += mSubViewWidth;
 			}
-			(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);
+
+            RefreshContentSize();
 		}
+
+        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()
         {
@@ -125,20 +345,22 @@
 			{
 				return;
 			}
-			view.X =(int)realViewGroup.Frame.Right+ rigthView.Count * SubViewWidth;
+            var mSubViewWidth = isUseSameSubViewWidth ? SubViewWidth : view.Width;
+
+            view.X =(int)realViewGroup.Frame.Right + GetAllRightViewWidth();
 			view.Y = 0;
-			view.Width = SubViewWidth;
+			view.Width = mSubViewWidth;
 			view.Height = Height;
 			viewGroup.AddSubview(view.RealView);
 			view.Parent = this;
 			view.Refresh();
 			rigthView.Add(view);
 
-			(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);
-
+            RefreshContentSize();
 		}
 
+        nfloat beforeXScrollX;
+        nfloat moveX;
         /// <summary>
         /// 鍦ㄦ粦鍔ㄤ簨浠朵笅锛屽彲鏄剧ず闅愯棌浜涜嚜瀹氫箟瑙嗗浘
         /// </summary>
@@ -150,9 +372,62 @@
 			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