wxr
2020-04-14 06696e6f225733a60b03eea4a7c6374053d92c1d
Shared.IOS/UI/RowLayout.cs
@@ -11,6 +11,21 @@
   /// </summary>
   public class RowLayout : ViewGroup
   {
        ///// <summary>
        ///// OpenLeftMenuAction
        ///// </summary>
        //public Action OpenLeftMenuAction;
        ///// <summary>
        ///// OpenRightMenuAction
        ///// </summary>
        //public Action OpenRightMenuAction;
        /// <summary>
        /// OpenMenuAction
        /// </summary>
        public Action OpenMenuAction;
      /// <summary>
      /// 右边的视图列表
      /// </summary>
@@ -19,6 +34,10 @@
      /// 右边的视图列表
      /// </summary>
      internal System.Collections.Generic.List<Button> rigthView = new System.Collections.Generic.List<Button>();
        /// <summary>
        /// 下面那边张
        /// </summary>
        UIView lineUIView = new UIView();
      /// <summary>
      /// 重新刷新控件
@@ -26,6 +45,7 @@
      public override void Refresh()
      {
         base.Refresh();
            LineColor = lineColor;
      }
      /// <summary>
      /// 控件宽度
@@ -41,6 +61,10 @@
                base.Width = value;
                if (!IsCanRefresh)
                    return;
                var frame4 = lineUIView.Frame;
                frame4.Width = base.Width;
                lineUIView.Frame = frame4;
            }
      }
@@ -70,8 +94,208 @@
               frame.Height = Height;
               realViewGroup.Frame = frame;
            }
                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>
        /// 是否正打开
        /// </summary>
        //public bool IsOpening;
        public bool IsShowLeft;
        public bool IsShowRight;
        /// <summary>
        /// 关闭其他RowLayout 显示的View
        /// </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>
        /// 关闭显示的View
        /// </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>
        /// 是否使用同样的SubViewWidth宽
        /// </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>
      /// 增加左边视图
@@ -83,22 +307,36 @@
         {
            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);
            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);
      }
@@ -125,20 +363,26 @@
         {
            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();
            //         (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>
@@ -150,9 +394,63 @@
         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>