From f6fd8acd7c53c44187e70b4709443318a628f4b5 Mon Sep 17 00:00:00 2001 From: wxr <464027401@qq.com> Date: 星期二, 16 六月 2020 13:12:33 +0800 Subject: [PATCH] 2020-06-016 --- Shared.IOS/UI/RowLayout.cs | 270 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 249 insertions(+), 21 deletions(-) diff --git a/Shared.IOS/UI/RowLayout.cs b/Shared.IOS/UI/RowLayout.cs index 66462e2..558a638 100644 --- a/Shared.IOS/UI/RowLayout.cs +++ b/Shared.IOS/UI/RowLayout.cs @@ -11,10 +11,15 @@ /// </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> @@ -113,34 +118,209 @@ } } - /// <summary> - /// 澧炲姞宸﹁竟瑙嗗浘 - /// </summary> - /// <param name="view">View.</param> - public void AddLeftView(Button view) + /// <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() { @@ -165,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> @@ -197,9 +379,55 @@ 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