| | |
| | | using Shared.IO; |
| | | using CoreGraphics; |
| | | using Foundation; |
| | | using CoreAnimation; |
| | | |
| | | namespace Shared |
| | | { |
| | |
| | | |
| | | //readonly UIPageControl iosUIPageControl; |
| | | |
| | | |
| | | /// <summary> |
| | | /// 页面变化事件 |
| | | /// </summary> |
| | |
| | | /// </summary> |
| | | class MyHorizontalPages : UIScrollView |
| | | { |
| | | nfloat beforeXScrollX; |
| | | nfloat moveX; |
| | | |
| | | [Weak] HorizontalPages HorizontalPages; |
| | | //nfloat mLastX, mLastY, deltaX; |
| | | public MyHorizontalPages(HorizontalPages HorizontalPages) |
| | |
| | | |
| | | 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> |
| | |
| | | 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 |
| | | { |
| | |
| | | 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> |
| | | /// 是否允许滑动 |
| | |
| | | |
| | | 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; |
| | |
| | | } |
| | | |
| | | //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; |
| | |
| | | |
| | | 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; |
| | | |
| | | |
| | |
| | | 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(); |
| | | } |
| | | |
| | | |
| | | |