wxr
2020-04-14 06696e6f225733a60b03eea4a7c6374053d92c1d
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>
        /// 下面那边张
        /// </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>
        /// 是否正打开
        /// </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>
        /// 增加左边视图
        /// </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>