From b8e94316e41eba72d927d5ca7d931b26139ee8ff Mon Sep 17 00:00:00 2001 From: wxr <464027401@qq.com> Date: 星期一, 15 六月 2020 09:12:53 +0800 Subject: [PATCH] 20200612 --- Shared.IOS/UI/HorizontalPages.cs | 1380 ++++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 832 insertions(+), 548 deletions(-) diff --git a/Shared.IOS/UI/HorizontalPages.cs b/Shared.IOS/UI/HorizontalPages.cs index f891f2a..938bc33 100644 --- a/Shared.IOS/UI/HorizontalPages.cs +++ b/Shared.IOS/UI/HorizontalPages.cs @@ -14,156 +14,859 @@ { readonly MyHorizontalPages iosUIScrolView; - //readonly UIPageControl iosUIPageControl; - - /// <summary> /// 椤甸潰鍙樺寲浜嬩欢 /// </summary> - public Action<HorizontalPages,int> PageChange; + public Action<HorizontalPages, int> PageChange; + + /// <summary> + /// 寮�濮嬫粦鍔ㄤ簨浠� + /// </summary> + public Action StartScrollAction; + /// <summary> + /// 缁撴潫婊戝姩浜嬩欢 + /// </summary> + public Action EndScrollAction ; + + /// <summary> + /// 娌℃湁鏇村鎻愮ずAction锛屽凡缁忔槸鏈�鍚庝竴涓� + /// </summary> + public Action NoMoreAction; + + //ImageView LeftImageView = new ImageView() { ImagePath = "RoomIcon/1.jpg" }; + //ImageView RightImageView = new ImageView() { ImagePath = "RoomIcon/2.jpg" }; + + + + + /// <summary> + /// 鏋勯�犲嚱鏁� + /// </summary> + public HorizontalPages() + { + viewGroup = new UIView(); + iosUIScrolView = new MyHorizontalPages(this) { }; + iosUIScrolView.Bounces = false; + InitMyHorizontalPagesEvent(); + realViewGroup = iosUIScrolView; + //鍚姩缈婚〉鍔熻兘 + //iosUIScrolView.PagingEnabled = true; + iosUIScrolView.ShowsHorizontalScrollIndicator = false; + viewGroup.AddSubview(iosUIScrolView); + pagePadding = Application.GetRealWidth(50); + rowPadding = Application.GetRealWidth(100); + mTCBJ = Application.GetRealWidth(50); + + } + + ImageView LeftImageView; + ImageView RightImageView; + /// <summary> + /// 鏄惁璁剧疆浜嗚櫄鍋囪儗鏅疺iew 璁剧疆浜嗘墠鏄剧ず + /// </summary> + bool IsSetLeftAndRightImageView = false; + /// <summary> + /// 璁剧疆鎺у埗鏈�宸﹀拰鏈�鍙�2杈癸紝濉厖鐨勫亣鑳屾櫙View锛屼笉璁剧疆涓嶆樉绀猴紝闇�瑕佸湪AddChidren 鍓嶈皟鐢ㄨ鏂规硶 + /// </summary> + /// <param name="mLeftImageView"></param> + /// <param name="mRightImageView"></param> + public void SetLeftAndRightImageView(ImageView mLeftImageView, ImageView mRightImageView) + { + if (mLeftImageView == null) return; + + if (mRightImageView == null) return; + + //璁剧疆涔嬪墠鍏堟竻绌轰竴娆� + foreach (var view in iosUIScrolView.Subviews) + { + view.RemoveFromSuperview(); + } + + LeftImageView = mLeftImageView; + iosUIScrolView.AddSubview(LeftImageView.RealView); + LeftImageView.Parent = this; + LeftImageView.Refresh(); + + RightImageView = mRightImageView; + iosUIScrolView.AddSubview(RightImageView.RealView); + RightImageView.Parent = this; + RightImageView.Refresh(); + + IsSetLeftAndRightImageView = true; + + } + + bool isNoMore; + bool isStart; + int mTouchSlop = 20; + nfloat beforeXScrollX; + nfloat moveX; + void InitMyHorizontalPagesEvent() + { + + + iosUIScrolView.Scrolled += (s, e) => + { + //Shared.HDLUtils.WriteLine($"HorizontalPages Scrolled ContentOffsetX:{iosUIScrolView.ContentOffset.X}"); + moveX = iosUIScrolView.ContentOffset.X - beforeXScrollX; + RefreshPageView(); + + if (mTouchSlop < Math.Abs(moveX)) + { + if (!isStart) + { + + //褰撳墠绱㈠紩涓猴紝涓嶆槸绗竴涓垨鑰呮渶鍚庝竴涓紝婊戝姩璺濈澶т簬瑙﹀彂璺濈骞朵笖娌℃墽琛岃繃鍒� 鎵ц涓�娆tartScrollAction + if ((moveX > 0 && PageIndex < ChildrenCount - 1) || (moveX < 0 && PageIndex > 0)) + { + isStart = true; + StartScrollAction?.Invoke(); + } + + } + + + if (!isNoMore && !bSendPageChange) + { + //褰撳墠绱㈠紩涓虹涓�涓垨鑰呮渶鍚庝竴涓紝婊戝姩璺濈澶т簬瑙﹀彂璺濈銆佹病鎵ц杩囥�丳ageIndex娌″彉鍖栥�佸垯鎵ц涓�娆oMoreAction + if ((moveX > 0 && PageIndex == ChildrenCount - 1 && iosUIScrolView.ContentOffset.X > iosUIScrolView.ContentSize.Width - iosUIScrolView.Frame.Width) || (moveX < 0 && PageIndex == 0 && iosUIScrolView.ContentOffset.X < 0)) + { + isNoMore = true; + NoMoreAction?.Invoke(); + } + + } + } + + + }; + + iosUIScrolView.DraggingStarted += (sender, e) => + { + //Shared.HDLUtils.WriteLine("HorizontalPages DraggingStarted"); + SetIsScrolling(true); + beforeXScrollX = iosUIScrolView.ContentOffset.X; + isStart = false; + isNoMore = false; + //StartScrollAction?.Invoke(); + }; + + iosUIScrolView.DecelerationStarted += (s, e) => + { + GetMovePageIndex(); + + }; + + iosUIScrolView.DecelerationEnded += (s, e) => + { + + if (!bSendPageChange && (PageIndex == ChildrenCount - 1 || PageIndex == 0 )) { + //褰撳墠绱㈠紩涓猴紝绗竴涓垨鑰呮渶鍚庝竴涓紝骞朵笖涔嬪墠鎵ц杩囧紑濮婣ction + SendEndScrollAction(); + + + } + + }; + + iosUIScrolView.DraggingEnded += (s, e) => + { + if (!e.Decelerate) + { + GetMovePageIndex(); + } + }; + + iosUIScrolView.ScrollAnimationEnded += (s, e) => + { + //Shared.HDLUtils.WriteLine("HorizontalPages ScrollAnimationEnded"); + SendIfPageChange(); + SetIsScrolling(false); + }; + } + + + private void GetMovePageIndex() + { + + if (mTouchSlop < Math.Abs(moveX)) + { + if (moveX < 0) + { + PageIndex -= 1; + } + else if (moveX > 0) + { + PageIndex += 1; + } + } + else + { + PageIndex = PageIndex; + + } + + } + + //涓や釜Page鐣岄潰涔嬮棿鐨勮窛绂� + int pagePadding; + /// <summary> + /// 鐣岄潰涔嬮棿鐨勮竟璺� + /// </summary> + public int JMBJ + { + get + { + return pagePadding; + } + set + { + pagePadding = value; + rowPadding = mTCBJ + pagePadding; + RefreshScrollWidth(); + ReLocation(); + } + } + + //page鐨勪笌鎵嬫満灞忓箷鐨勮竟璺� = 绐佸嚭瀹藉害 + 涓や釜Page涔嬮棿鐨勮窛绂� + int rowPadding; + /// <summary> + /// 绐佸嚭瀹藉害 + /// </summary> + int mTCBJ; + public int TCBJ + { + get + { + return mTCBJ; + } + set + { + mTCBJ = value; + rowPadding = mTCBJ + 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; + } + + /// <summary> + /// 鑷姩璁$畻鍒锋柊鎵�鏈塚iew鐨勯珮搴︼紝瀹炵幇缂╂斁鏁堟灉 + /// </summary> + private void RefreshPageView() + { + //RefreshView(); + //RefreshViewWithTransform3D(); + //RefreshViewWithChangeHeight(); + RefreshViewWithChangeHeightNew(); + //RefreshViewWithChangeHeightSF(); + } + + //********************Transform3D 鏃嬭浆鏁堟灉鏂规硶********************** + //榛樿25搴� + nfloat transformAngle = (nfloat)(25 * Math.PI / 180.0); + //鏃嬭浆瑙掑害 + public int TransformAngle + { + set + { + transformAngle = (nfloat)(value * Math.PI / 180.0); + } + } + + ///// <summary> + ///// 鏃嬭浆鏁堟灉 + ///// </summary> + //public void RefreshViewWithTransform3D() + //{ + // if (ChildrenCount <= 0) return; + + // if (PageIndex > ChildrenCount - 1) + // { + // PageIndex = ChildrenCount - 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 鍓嶅悗鏄惁鏈塿iew锛屽苟鏃嬭浆 + // if (PageIndex - 1 >= 0) + // { + // var mRotate1 = transform.Rotate(transformAngle, 0f, 1f, 0f); + // iosUIScrolView.Subviews[PageIndex - 1].Layer.Transform = mRotate1; + // } + + // if (PageIndex <= ChildrenCount - 2) + // { + // var mRotate2 = transform.Rotate(-1 * transformAngle, 0f, 1f, 0f); + // iosUIScrolView.Subviews[PageIndex + 1].Layer.Transform = mRotate2; + // } + + + + + //} + + /// <summary> + /// 鍒锋柊鏈�澶ц窛绂诲�� + /// </summary> + double MaxDistance; + + + private void RefreshViewWithChangeHeight() + { + if (ChildrenCount <= 0) return; + + if (PageIndex > ChildrenCount - 1) + { + PageIndex = ChildrenCount - 1; + } + + MaxDistance = Width - 2 * TCBJ - JMBJ; + double centerX = iosUIScrolView.ContentOffset.X + iosUIScrolView.Frame.Width * 0.5; + + foreach (UIView mSubview in iosUIScrolView.Subviews) + { + + double distance = Math.Abs(mSubview.Center.X - centerX); + var HH = 0; + if (distance <= 0) + { + HH = 0; + } + else if (distance >= MaxDistance) + { + HH = JMBJ; + } + else + { + HH = (int)((distance / MaxDistance) * JMBJ); + + } + var mFrame = mSubview.Frame; + mFrame.Height = Height - HH * 2; + mFrame.Y = HH; + mSubview.Frame = mFrame; + + //mSubview.MaskView + + + //double distance = Math.Abs(mSubview.Center.X - centerX); + //double factor = 0.01; + //float scale = (float)(1.0 / (1 + distance * factor)); + + ////var mFrame = mSubview.Frame; + ////mFrame.Height = Height * scale; + ////mFrame.Y = (Height - mFrame.Height) / 2; + ////mSubview.Frame = mFrame; + + //var mFrame = mSubview.Frame; + //var HH = (int)(MaxChangeHeight - MaxChangeHeight * scale); + //mFrame.Height = Height - HH; + //mFrame.Y = HH / 2; + //mSubview.Frame = mFrame; + + } + } + + /// <summary> + /// 鍚屾椂鍒锋柊瀛恦iew 鍜孖mageView鐨勯珮搴︼紝鏆傛椂瑙e喅搴曢儴鍦嗚澶辨晥闂 + /// </summary> + /// <param name="mView"></param> + /// <param name="height"></param> + void RefreshSubviewHeight(View mView, nfloat height) + { + try + { + if (mView is ViewGroup) + { + var tempViewGroup = (ViewGroup)mView; + for (int i = 0; i < tempViewGroup.ChildrenCount; i++) + { + if (tempViewGroup.GetChildren(i) is ViewGroup) + { + var tempViewGroup2 = (ViewGroup)tempViewGroup.GetChildren(i); + for (int j = 0; j < tempViewGroup2.ChildrenCount; j++) + { + if (tempViewGroup2.GetChildren(j) is ImageView && tempViewGroup2.GetChildren(j).Tag.ToString() == "R") + { + + tempViewGroup2.GetChildren(j).Height = (int)height; + break; + } + } + if (tempViewGroup2.Tag.ToString() == "R") + { + tempViewGroup2.Height = (int)height; + break; + } + } + + } + } + } + catch { } + } + + /// <summary> + /// 璁$畻婊戝姩缂╂斁楂樺害鐨勬柟娉� + /// </summary> + private void RefreshViewWithChangeHeightNew() + { + if (ChildrenCount <= 0) return; + + if (PageIndex > ChildrenCount - 1) + { + PageIndex = ChildrenCount - 1; + } + + MaxDistance = Width - 2 * TCBJ - JMBJ; + double centerX = iosUIScrolView.ContentOffset.X + iosUIScrolView.Frame.Width * 0.5; + + for (int i = 0; i < ChildrenCount; i++) + { + var mSubview = GetChildren(i).RealView; + var view = GetChildren(i); + double distance = Math.Abs(mSubview.Center.X - centerX); + var HH = 0; + if (distance <= 0) + { + HH = 0; + } + else if (distance >= MaxDistance) + { + HH = JMBJ; + } + else + { + HH = (int)((distance / MaxDistance) * JMBJ); + + } + var mFrame = mSubview.Frame; + mFrame.Height = Height - HH * 2; + mFrame.Y = HH; + mSubview.Frame = mFrame; + + RefreshSubviewHeight(view, mFrame.Height); + } + } + + //private void RefreshViewWithChangeHeightSF() + //{ + // if (ChildrenCount <= 0) return; + + // if (PageIndex > ChildrenCount - 1) + // { + // PageIndex = ChildrenCount - 1; + // } + + // MaxDistance = Width - 2 * TCBJ - JMBJ; + // double centerX = iosUIScrolView.ContentOffset.X + iosUIScrolView.Frame.Width * 0.5; + + // foreach (UIView mSubview in iosUIScrolView.Subviews) + // { + + // double distance = Math.Abs(mSubview.Center.X - centerX); + // nfloat HH = 1; + // if (distance <= 0) + // { + // mSubview.Transform = CGAffineTransform.MakeScale(1.0f, 1.0f); + // } + // else if (distance >= MaxDistance) + // { + // mSubview.Transform = CGAffineTransform.MakeScale(1.0f, 0.8f); + // } + // else + // { + // HH = (nfloat)((1-distance / MaxDistance) * 0.2f) + 0.8f; + // mSubview.Transform = CGAffineTransform.MakeScale(1.0f, 0.8f); + // } + + // } + //} + + /// <summary> + /// 鏄惁鍏佽婊戝姩 + /// </summary> + /// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value> + public bool ScrollEnabled + { + get + { + return (iosUIScrolView as MyHorizontalPages).ScrollEnabled; + } + set + { + (iosUIScrolView as MyHorizontalPages).ScrollEnabled = value; + } + } + + int pageIndex; + /// <summary> + /// 璁剧疆鎴栬�呰幏鍙栧綋鍓嶇殑鐣岄潰绱㈠紩 + /// </summary> + /// <value>The index of the page.</value> + public int PageIndex + { + get + { + return pageIndex; + } + set + { + if (value < 0 || ChildrenCount <= value) + { + + return; + } + int beforePageIndex = pageIndex; + pageIndex = value; + if (!IsCanRefresh) + { + return; + } + + var viewSize = iosUIScrolView.Frame.Size; + + RefreshPageView(); + var rect = new CGRect(pageIndex * viewSize.Width, 0, viewSize.Width, viewSize.Height); + if (pageIndex != 0) + { + var frame = GetChildren(pageIndex).RealView.Frame; + var w = frame.X - rowPadding; + + rect = new CGRect(w, 0, viewSize.Width, viewSize.Height); + //Shared.HDLUtils.WriteLine($"CGRect xx-------{w}"); + } + + //Shared.HDLUtils.WriteLine($"pageIndex xx-------{pageIndex}"); + iosUIScrolView.ScrollRectToVisible(rect, true); + + if (beforePageIndex != pageIndex) + { + bSendPageChange = true;//鍙戦�佹敼鍙樻爣蹇� + if (!isStart) + { + isStart = true; + StartScrollAction?.Invoke(); + } + } + else + { + SendEndScrollAction(); + } + + + } + } + + /// <summary> + /// 鍒ゆ柇鏄惁闇�瑕佸彂閫佺粨鏉熸粦鍔ㄤ簨浠� + /// </summary> + void SendEndScrollAction() { + if (isStart) + { + isStart = false; + EndScrollAction?.Invoke(); + } + } + + bool bSendPageChange = false; + /// <summary> + /// 鍒ゆ柇鏄惁瑕佸彂閫佹敼鍙樹簨浠� + /// </summary> + private void SendIfPageChange() + { + if (bSendPageChange) + { + bSendPageChange = false; + PageChange?.Invoke(this, pageIndex); + } + + //鍒ゆ柇鏄惁闇�瑕佸彂閫佺粨鏉熸粦鍔ㄤ簨浠� + SendEndScrollAction(); + } + + bool isScrolling; + /// <summary> + /// 鏄惁姝e湪婊戝姩 + /// </summary> + public bool ISScrolling + { + get + { + return isScrolling; + } + } + + private void SetIsScrolling(bool bSctolling) + { + if (isScrolling == bSctolling) return; + + Shared.HDLUtils.WriteLine($"HorizontalPages StartScroll: {bSctolling}"); + isScrolling = bSctolling; + } + + /// <summary> + /// 鏄惁姝e湪婊戝姩 + /// </summary> + /// <value><c>true</c> if decelerating; otherwise, <c>false</c>.</value> + public bool Decelerating + { + get + { + return iosUIScrolView.Decelerating; + } + } + + //public void DelayPageChange() + //{ + // PageChange?.Invoke(this, pageIndex); + + // //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) + { + base.AddChidren(view); + ReLocation(); + } + + /// <summary> + /// 閲嶆柊鎺掍綅缃強璁惧鍐呭澶у皬 + /// </summary> + public virtual void ReLocation() + { + try + { + if (ChildrenCount == 0) + { + return; + } + + + var frame0 = GetChildren(0).RealView.Frame; + frame0.X = rowPadding; + frame0.Y = 0; + frame0.Width = mPageWidth; + frame0.Height = iosUIScrolView.Frame.Height; + GetChildren(0).RealView.Frame = frame0; + + + + for (int i = 1; i < ChildrenCount; i++) + { + var frame = GetChildren(i).RealView.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; + GetChildren(i).RealView.Frame = frame; + } + iosUIScrolView.ContentSize = new CoreGraphics.CGSize(GetChildren(ChildrenCount - 1).RealView.Frame.Right + rowPadding, iosUIScrolView.Frame.Height); + + //iosUIScrolView.ContentSize = new CoreGraphics.CGSize(iosUIScrolView.Subviews[ChildrenCount - 1].Frame.Right + rowPadding, iosUIScrolView.Frame.Height); + + if (IsSetLeftAndRightImageView) + { + var leftFrame = iosUIScrolView.Subviews[0].Frame; + leftFrame.X = TCBJ - mPageWidth; + leftFrame.Y = JMBJ; + leftFrame.Width = mPageWidth; + leftFrame.Height = Height - JMBJ * 2; + iosUIScrolView.Subviews[0].Frame = leftFrame; + + + var rightFrame = iosUIScrolView.Subviews[1].Frame; + rightFrame.X = rowPadding + (mPageWidth + pagePadding) * (ChildrenCount); + rightFrame.Y = JMBJ; + rightFrame.Width = mPageWidth; + rightFrame.Height = Height - JMBJ * 2; + iosUIScrolView.Subviews[1].Frame = rightFrame; + } + + RefreshPageView(); + } + catch { } + } + + + + /// <summary> + /// 鎺т欢瀹藉害 + /// </summary> + /// <value>The width.</value> + public override int Width + { + get + { + return base.Width; + } + set + { + base.Width = 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; + + } + } + + /// <summary> + /// Bounces + /// </summary> + public bool Bounces + { + get + { + return iosUIScrolView.Bounces; + } + set + { + iosUIScrolView.Bounces = value; + } + } + + + + + /// <summary> + /// 绉婚櫎褰撳墠鎺т欢 + /// </summary> + /// <param name="view">View.</param> + internal override void Remove(View view) + { + base.Remove(view); + ReLocation(); + + if (PageIndex > ChildrenCount - 1) + { + PageIndex = ChildrenCount - 1; + } + + } + + /// <summary> + /// 绉婚櫎鎵�鏈夌殑鎺т欢 + /// </summary> + public override void RemoveAll() + { + base.RemoveAll(); + ReLocation(); + PageIndex = 0; + } + + /// <summary> + /// 鏍规嵁绱㈠紩绉婚櫎鎺т欢 + /// </summary> + /// <param name="index">Index.</param> + public override void RemoveAt(int index) + { + if (viewList.Count - 1 < index || index < 0) + { + return; + } + Remove(viewList[index]); + } + /// <summary> /// 鍨傜洿鏂瑰悜婊氬姩瑙嗗浘 /// </summary> class MyHorizontalPages : UIScrollView { - nfloat beforeXScrollX; - nfloat moveX; - [Weak] HorizontalPages HorizontalPages; - //nfloat mLastX, mLastY, deltaX; + [Weak] HorizontalPages HorizontalPages; 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 / (this.HorizontalPages.mScrollWidth)); - //this.HorizontalPages.PageIndex = tempPageIndex; - GetMovePageIndex(); - - }; - - //DecelerationEnded += (s, e) => - //{ - // Console.WriteLine("HorizontalPages DecelerationEnded"); - - //}; - - DraggingEnded += (s, e) => - { - - var tempUIScrolView = s as MyHorizontalPages; - if (!e.Decelerate) - { - 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() { + ///// <summary> + ///// 鐐瑰嚮寮�濮� + ///// </summary> + ///// <param name="touches">Touches.</param> + ///// <param name="evt">Evt.</param> + //public override void TouchesBegan(NSSet touches, UIEvent evt) + //{ - 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; - } + // HorizontalPages?.TouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this)); - } + //} + //int mTouchSlop = 20; + //bool bMove; + ///// <summary> + ///// 绉诲姩 + ///// </summary> + ///// <param name="touches">Touches.</param> + ///// <param name="evt">Evt.</param> + //public override void TouchesMoved(NSSet touches, UIEvent evt) + //{ + // HorizontalPages?.TouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this)); - /// <summary> - /// 鐐瑰嚮寮�濮� - /// </summary> - /// <param name="touches">Touches.</param> - /// <param name="evt">Evt.</param> - public override void TouchesBegan(NSSet touches, UIEvent evt) - { - - HorizontalPages?.TouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this)); + //} + ///// <summary> + ///// 鐐瑰嚮寮硅捣 + ///// </summary> + ///// <param name="touches">Touches.</param> + ///// <param name="evt">Evt.</param> + //public override void TouchesEnded(NSSet touches, UIEvent evt) + //{ + // HorizontalPages?.TouchEvent(EventActions.Up, (touches.AnyObject as UITouch).LocationInView(this)); + //} - //CGPoint point = (touches.AnyObject as UITouch).LocationInView(this); - ////璁板綍鐐瑰嚮鐨勬渶鏂癤鍧愭爣 - //mLastX = point.X; - //bMove = false; - //System.Console.WriteLine($"TouchesBegan-------{mLastX}"); - } - - int mTouchSlop = 20; - bool bMove; - /// <summary> - /// 绉诲姩 - /// </summary> - /// <param name="touches">Touches.</param> - /// <param name="evt">Evt.</param> - public override void TouchesMoved(NSSet touches, UIEvent evt) - { - - - HorizontalPages?.TouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this)); - - //CGPoint point = (touches.AnyObject as UITouch).LocationInView(this); - //deltaX = point.X - mLastX; - //if (Math.Abs(deltaX) >= mTouchSlop) { - // bMove = true; - //} - //System.Console.WriteLine($"deltaX-------{deltaX}"); - - } - /// <summary> - /// 鐐瑰嚮寮硅捣 - /// </summary> - /// <param name="touches">Touches.</param> - /// <param name="evt">Evt.</param> - public override void TouchesEnded(NSSet touches, UIEvent evt) - { - HorizontalPages?.TouchEvent(EventActions.Up, (touches.AnyObject as UITouch).LocationInView(this)); - - //if (bMove) - //{ - // if (deltaX < 0)//宸︽粦 - // { - // this.HorizontalPages.PageIndex--; - // } - // else - // { - // this.HorizontalPages.PageIndex++; - - // } - //} - } - - public override void TouchesCancelled(NSSet touches, UIEvent evt) - { - HorizontalPages?.TouchEvent(EventActions.Cancel, (touches.AnyObject as UITouch).LocationInView(this)); - } + //public override void TouchesCancelled(NSSet touches, UIEvent evt) + //{ + // HorizontalPages?.TouchEvent(EventActions.Cancel, (touches.AnyObject as UITouch).LocationInView(this)); + //} /// <summary> /// 妗嗘灦榛樿鍔犱簡涓や釜UIImageView 锛岃繖鏍峰彲浠ュ幓鎺夐粯璁ゆ坊鍔� /// </summary> @@ -182,425 +885,6 @@ base.AddSubview(view); } } - - /// <summary> - /// 鏋勯�犲嚱鏁� - /// </summary> - public HorizontalPages() - { - viewGroup = new UIView(); - iosUIScrolView = new MyHorizontalPages(this) { }; - realViewGroup = iosUIScrolView; - //鍚姩缈婚〉鍔熻兘 - //iosUIScrolView.PagingEnabled = true; - iosUIScrolView.ShowsHorizontalScrollIndicator = false; - viewGroup.AddSubview(iosUIScrolView); - _PagePadding = Application.GetRealWidth(50); - _RowPadding = Application.GetRealWidth(100); - _TCBJ = Application.GetRealWidth(50); - - } - - - - // //涓や釜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; - /// <summary> - /// 鐣岄潰涔嬮棿鐨勮竟璺� - /// </summary> - public int JMBJ - { - get - { - return _PagePadding; - } - set - { - _PagePadding = value; - _RowPadding = _TCBJ + _PagePadding; - RefreshScrollWidth(); - ReLocation(); - } - } - - //page鐨勪笌鎵嬫満灞忓箷鐨勮竟璺� = 绐佸嚭瀹藉害 + 涓や釜Page涔嬮棿鐨勮窛绂� - int _RowPadding; - /// <summary> - /// 绐佸嚭瀹藉害 - /// </summary> - int _TCBJ; - public int TCBJ - { - get - { - return _TCBJ; - } - set - { - _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 鍓嶅悗鏄惁鏈塿iew锛屽苟鏃嬭浆 - 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> - /// 鏄惁鍏佽婊戝姩 - /// </summary> - /// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value> - public bool ScrollEnabled - { - get - { - return (iosUIScrolView as MyHorizontalPages).ScrollEnabled; - } - set - { - (iosUIScrolView as MyHorizontalPages).ScrollEnabled = value; - } - } - - int pageIndex; - /// <summary> - /// 璁剧疆鎴栬�呰幏鍙栧綋鍓嶇殑鐣岄潰绱㈠紩 - /// </summary> - /// <value>The index of the page.</value> - public int PageIndex - { - get - { - return pageIndex; - } - set - { - if (value < 0 || ChildrenCount <= value) - { - return; - } - int beforePageIndex = pageIndex; - pageIndex = value; - if (!IsCanRefresh) - { - return; - } - - 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; - var w = frame.X - _RowPadding; - - rect = new CGRect(w, 0, viewSize.Width, viewSize.Height); - //System.Console.WriteLine($"CGRect xx-------{w}"); - } - - //System.Console.WriteLine($"pageIndex xx-------{pageIndex}"); - - //Console.WriteLine("HorizontalPages ScrollRectToVisible"); - iosUIScrolView.ScrollRectToVisible(rect, true); - - if (beforePageIndex != pageIndex) - { - //Console.WriteLine("HorizontalPages DelayPageChange"); - DelayPageChange(); - //PageChange?.Invoke(this, pageIndex); - } - } - } - - - - 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 dddd = Application.DesignWidth; - base.AddChidren(view); - ReLocation(); - } - - /// <summary> - /// 閲嶆柊鎺掍綅缃強璁惧鍐呭澶у皬 - /// </summary> - public virtual void ReLocation() - { - if (iosUIScrolView.Subviews.Length == 0) - { - return; - } - - 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.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(); - } - - - - /// <summary> - /// 鎺т欢瀹藉害 - /// </summary> - /// <value>The width.</value> - public override int Width - { - get - { - return base.Width; - } - set - { - base.Width = 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; - - } - } - - /// <summary> - /// 绉婚櫎褰撳墠鎺т欢 - /// </summary> - /// <param name="view">View.</param> - internal override void Remove(View view) - { - base.Remove(view); - ReLocation(); - - if (PageIndex > ChildrenCount - 1) - { - PageIndex = ChildrenCount - 1; - } - - } - - /// <summary> - /// 绉婚櫎鎵�鏈夌殑鎺т欢 - /// </summary> - public override void RemoveAll() - { - base.RemoveAll(); - ReLocation(); - PageIndex = 0; - } - - /// <summary> - /// 鏍规嵁绱㈠紩绉婚櫎鎺т欢 - /// </summary> - /// <param name="index">Index.</param> - public override void RemoveAt(int index) - { - if (viewList.Count - 1 < index || index < 0) - { - return; - } - Remove(viewList[index]); - } } } -- Gitblit v1.8.0