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