wxr
2020-01-10 1a4b95a7ebef71838bd3eda2c22056bbf0db65ec
Shared.IOS/UI/HorizontalPages.cs
@@ -3,6 +3,7 @@
using Shared.IO;
using CoreGraphics;
using Foundation;
using CoreAnimation;
namespace Shared
{
@@ -15,6 +16,7 @@
        //readonly UIPageControl iosUIPageControl;
        /// <summary>
        /// 页面变化事件
        /// </summary>
@@ -25,6 +27,9 @@
        /// </summary>
        class MyHorizontalPages : UIScrollView
        {
            nfloat beforeXScrollX;
            nfloat moveX;
            [Weak]  HorizontalPages HorizontalPages;
            //nfloat mLastX, mLastY, deltaX;
            public MyHorizontalPages(HorizontalPages HorizontalPages)
@@ -32,29 +37,68 @@
                this.HorizontalPages = HorizontalPages;
                //this.ScrollEnabled = false;
                Scrolled += (s, e) =>
                {
                    moveX = this.ContentOffset.X - beforeXScrollX;
                };
                DraggingStarted += (sender, e) =>
                {
                    beforeXScrollX = this.ContentOffset.X;
                };
                DecelerationStarted += (s, e) =>
                {
                    var tempUIScrolView = s as MyHorizontalPages;
                    //获取当前界面的索引
                    //System.Console.WriteLine($"DecelerationStarted-------{tempUIScrolView.ContentOffset.X}");
                    var tempPageIndex = Convert.ToInt32(tempUIScrolView.ContentOffset.X / (tempUIScrolView.Frame.Width - 2 * this.HorizontalPages._RowPadding + this.HorizontalPages._PagePadding));
                    this.HorizontalPages.PageIndex = tempPageIndex;
                    //var tempUIScrolView = s as MyHorizontalPages;
                    ////获取当前界面的索引
                    ////System.Console.WriteLine($"DecelerationStarted-------{tempUIScrolView.ContentOffset.X}");
                    //var tempPageIndex = Convert.ToInt32(tempUIScrolView.ContentOffset.X / (this.HorizontalPages.mScrollWidth));
                    //this.HorizontalPages.PageIndex = tempPageIndex;
                    GetMovePageIndex();
                };
                DraggingEnded += (s, e) =>
                {
                //DecelerationEnded += (s, e) =>
                //{
                //    Console.WriteLine("HorizontalPages DecelerationEnded");
                //};
                 DraggingEnded += (s, e) =>
                {
                    var tempUIScrolView = s as MyHorizontalPages;
                    if (!e.Decelerate)
                    {
                        //System.Console.WriteLine($"DraggingEnded-------{tempUIScrolView.ContentOffset.X}");
                        var tempPageIndex = Convert.ToInt32(tempUIScrolView.ContentOffset.X / (tempUIScrolView.Frame.Width - 2 * this.HorizontalPages._RowPadding + this.HorizontalPages._PagePadding));
                        this.HorizontalPages.PageIndex = tempPageIndex;
                        GetMovePageIndex();
                        ////System.Console.WriteLine($"DraggingEnded-------{tempUIScrolView.ContentOffset.X}");
                        //var tempPageIndex = Convert.ToInt32(tempUIScrolView.ContentOffset.X / (this.HorizontalPages.mScrollWidth));
                        //this.HorizontalPages.PageIndex = tempPageIndex;
                    }
                };
            }
            private void GetMovePageIndex() {
                if (mTouchSlop < Math.Abs(moveX))
                {
                    if (moveX < 0)
                    {
                        this.HorizontalPages.PageIndex -= 1;
                    }
                    else if (moveX > 0)
                    {
                        this.HorizontalPages.PageIndex += 1;
                    }
                }
                else
                {
                    this.HorizontalPages.PageIndex = this.HorizontalPages.PageIndex;
                }
            }
            /// <summary>
            /// 点击开始
            /// </summary>
@@ -153,12 +197,52 @@
            viewGroup.AddSubview(iosUIScrolView);
            _PagePadding = Application.GetRealWidth(50);
            _RowPadding = Application.GetRealWidth(100);
            _TCBJ = Application.GetRealWidth(50);
        }
         //两个Page之间的距离
        // //两个Page之间的距离
        //int _PagePadding;
        //public int PagePadding
        //{
        //    get
        //    {
        //        return _PagePadding;
        //    }
        //    set
        //    {
        //        _PagePadding = value;
        //        ReLocation();
        //    }
        //}
        ////page的外边距
        //int _RowPadding;
        //public int RowPadding
        //{
        //    get
        //    {
        //        return _RowPadding;
        //    }
        //    set
        //    {
        //        _RowPadding = value;
        //        ReLocation();
        //    }
        //}
        /// <summary>
        /// 突出宽度
        /// </summary>
        //public int JMBJ
        //两个Page界面之间的距离
        int _PagePadding;
        public int PagePadding
        /// <summary>
        /// 界面之间的边距
        /// </summary>
        public int JMBJ
        {
            get
            {
@@ -167,28 +251,148 @@
            set
            {
                _PagePadding = value;
                _RowPadding = _TCBJ + _PagePadding;
                RefreshScrollWidth();
                ReLocation();
            }
        }
        //page的外边距
        //page的与手机屏幕的边距 = 突出宽度 + 两个Page之间的距离
        int _RowPadding;
        public int RowPadding
        /// <summary>
        /// 突出宽度
        /// </summary>
        int _TCBJ;
        public int TCBJ
        {
            get
            {
                return _RowPadding;
                return _TCBJ;
            }
            set
            {
                _RowPadding = value;
                _TCBJ = value;
                _RowPadding = _TCBJ + _PagePadding;
                RefreshScrollWidth();
                ReLocation();
            }
        }
        int mScrollWidth;
        int mPageWidth;
        private void RefreshScrollWidth()
        {
            mScrollWidth = (int)this.RealView.Frame.Width - 2 * _RowPadding + _PagePadding;
            mPageWidth = (int)this.RealView.Frame.Width - 2 * _RowPadding;
        }
        private void RefreshPageView() {
            //RefreshView();
            RefreshViewWithTransform3D();
        }
        //********************Transform3D 旋转效果方法**********************
        //默认25度
        nfloat transformAngle = (nfloat)(25 * Math.PI / 180.0);
        //旋转角度
        public int TransformAngle
        {
            set
            {
                transformAngle = (nfloat)(value * Math.PI / 180.0);
            }
        }
        //
        public void RefreshViewWithTransform3D()
        {
            if (iosUIScrolView.Subviews.Length <= 0) return;
            if (PageIndex > iosUIScrolView.Subviews.Length - 1)
            {
                PageIndex = iosUIScrolView.Subviews.Length - 1;
            }
            // - 单位矩阵
            CATransform3D transform = CATransform3D.Identity;
            // - 增加透视效果
            transform.m34 = (nfloat)(-1.0 / 500);
            var mRotate = transform.Rotate(0, 0f, 1f, 0f);
            iosUIScrolView.Subviews[PageIndex].Layer.Transform = mRotate;
            //判断PageIndex 前后是否有view,并旋转
            if (PageIndex - 1 >= 0)
            {
                var mRotate1 = transform.Rotate(transformAngle, 0f, 1f, 0f);
                iosUIScrolView.Subviews[PageIndex - 1].Layer.Transform = mRotate1;
            }
            if (PageIndex <= iosUIScrolView.Subviews.Length - 2)
            {
                var mRotate2 = transform.Rotate(-1 * transformAngle, 0f, 1f, 0f);
                iosUIScrolView.Subviews[PageIndex + 1].Layer.Transform = mRotate2;
            }
        }
        int PaddingHeight = 20;
        //********************普通高度改变方法**********************
        private void RefreshView()
        {
            if (iosUIScrolView.Subviews.Length <= 0) return;
            if (PageIndex > iosUIScrolView.Subviews.Length - 1)
            {
                PageIndex = iosUIScrolView.Subviews.Length - 1;
            }
            //System.Console.WriteLine($" tempPageIndex:{PageIndex}");
            if (PageIndex == 0)
            {
                var frame0 = iosUIScrolView.Subviews[0].Frame;
                frame0.Height = iosUIScrolView.Frame.Height;
                frame0.Y = 0;
                iosUIScrolView.Subviews[0].Frame = frame0;
                if (iosUIScrolView.Subviews.Length > 1)
                {
                    var frame1 = iosUIScrolView.Subviews[1].Frame;
                    frame1.Height = iosUIScrolView.Frame.Height - PaddingHeight;
                    frame1.Y = PaddingHeight/2;
                    iosUIScrolView.Subviews[1].Frame = frame1;
                }
            }
            else
            {
                var frame0 = iosUIScrolView.Subviews[PageIndex].Frame;
                frame0.Height = iosUIScrolView.Frame.Height;
                frame0.Y = 0;
                iosUIScrolView.Subviews[PageIndex].Frame = frame0;
                var frame = iosUIScrolView.Subviews[PageIndex - 1].Frame;
                frame.Height = iosUIScrolView.Frame.Height - PaddingHeight;
                frame.Y = PaddingHeight/2;
                iosUIScrolView.Subviews[PageIndex - 1].Frame = frame;
                if (PageIndex <= iosUIScrolView.Subviews.Length - 2)
                {
                    var frame1 = iosUIScrolView.Subviews[PageIndex + 1].Frame;
                    frame1.Height = iosUIScrolView.Frame.Height - PaddingHeight;
                    frame1.Y = PaddingHeight/2;
                    iosUIScrolView.Subviews[PageIndex + 1].Frame = frame1;
                }
            }
        }
        /// <summary>
        /// 是否允许滑动
@@ -232,7 +436,7 @@
              
            var viewSize = iosUIScrolView.Frame.Size;
                RefreshPageView();
                var rect = new CGRect(pageIndex * viewSize.Width, 0, viewSize.Width, viewSize.Height);
                if (pageIndex != 0) {
                    var frame = iosUIScrolView.Subviews[pageIndex].Frame;
@@ -243,19 +447,39 @@
                }
                //System.Console.WriteLine($"pageIndex xx-------{pageIndex}");
                iosUIScrolView.ScrollRectToVisible(rect, false);
                //Console.WriteLine("HorizontalPages ScrollRectToVisible");
                iosUIScrolView.ScrollRectToVisible(rect, true);
                if (beforePageIndex != pageIndex)
                {
                    PageChange?.Invoke(this, pageIndex);
                {
                    //Console.WriteLine("HorizontalPages DelayPageChange");
                    DelayPageChange();
                    //PageChange?.Invoke(this, pageIndex);
                }
         }
      }
      /// <summary>
      /// 增加子控件
      /// </summary>
      /// <param name="view">View.</param>
      public override void AddChidren(View view)
        public void DelayPageChange()
        {
            new System.Threading.Thread(async () =>
            {
                System.Threading.Thread.Sleep(500);
                Application.RunOnMainThread(() =>
                {
                    PageChange?.Invoke(this, pageIndex);
                });
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 增加子控件
        /// </summary>
        /// <param name="view">View.</param>
        public override void AddChidren(View view)
      {
            //var v = Application.AverageScale;
            //var vv = Application.CurrentHeight;
@@ -276,6 +500,9 @@
            var frame0 = iosUIScrolView.Subviews[0].Frame;
            frame0.X = _RowPadding;
            frame0.Y = 0;
            frame0.Width = mPageWidth;
            frame0.Height = iosUIScrolView.Frame.Height;
            iosUIScrolView.Subviews[0].Frame = frame0;
@@ -283,12 +510,18 @@
            for (int i = 1; i < iosUIScrolView.Subviews.Length; i++)
         {
            var frame = iosUIScrolView.Subviews[i].Frame;
            frame.X = iosUIScrolView.Subviews[i - 1].Frame.Right+_PagePadding;
            iosUIScrolView.Subviews[i].Frame = frame;
                frame.Width = mPageWidth;
                frame.Height = iosUIScrolView.Frame.Height;
                frame.Y = 0;
                //frame.X = iosUIScrolView.Subviews[i - 1].Frame.Right + _PagePadding;
                frame.X = _RowPadding + (mPageWidth + _PagePadding)*i;
                iosUIScrolView.Subviews[i].Frame = frame;
         }
         iosUIScrolView.ContentSize = new CoreGraphics.CGSize(iosUIScrolView.Subviews[iosUIScrolView.Subviews.Length - 1].Frame.Right+_RowPadding, iosUIScrolView.Frame.Height);
      }
            RefreshPageView();
        }