public async override void LayoutSubviews() { base.LayoutSubviews(); // set correct page width if (pageWidth == -1) { pageWidth = Bounds.Width; } // simulate end of scrollView at right // condition to avoid new creations of views if (prevPageIndex >= rightIndexLimit) { prevPageIndex = PageIndex; if (PageIndex > rightIndexLimit) { // disable user interaction UserInteractionEnabled = false; // animate scrollview to correct position var offset = ContentOffset.X % pageWidth; SetContentOffset(new CGPoint(ContentOffset.X - offset, ContentOffset.Y), true); // wait for movement and enable user interaction await Task.Delay(350); UserInteractionEnabled = true; } return; } ContentSize = new CGSize(pageWidth * 20, Bounds.Height); _containerView.Frame = new CGRect(0, 0, ContentSize.Width, ContentSize.Height); RecenterIfNeeded(); // tile content in visible bounds CGRect visibleBounds = ConvertRectToView(Bounds, _containerView); nfloat minimumVisibleX = CGRectGetMinX(visibleBounds); nfloat maximumVisibleX = CGRectGetMaxX(visibleBounds); TileViews(minimumVisibleX, maximumVisibleX); if (prevPageIndex != PageIndex) { prevPageIndex = PageIndex; if (OnChangePage != null) { OnChangePage.Invoke(this, new EventArgs()); } } }
public void RefreshVisibleView() { if (Dragging) { return; } var currentView = pages.Find(v => v.Frame.X.CompareTo(ContentOffset.X) == 0); var center = currentView.Center; TView newView = InsertView(); var offSetY = ContentSize.Height; var frame = currentView.Frame; frame.Y += offSetY; newView.Frame = frame; UIView.Animate(0.6, 0.4, UIViewAnimationOptions.CurveEaseIn, () => { currentView.Alpha = 0.25f; }, null); UIView.Animate(0.7, 0.5, UIViewAnimationOptions.CurveEaseIn, () => { currentView.Transform = CGAffineTransform.MakeScale(0.75f, 0.75f); currentView.Center = new CGPoint(center.X, center.Y + 105); }, null); UIView.Animate(0.7, 0.6, UIViewAnimationOptions.CurveEaseInOut, () => { newView.Center = center; }, () => { foreach (var item in pages) { viewSource.Dispose(item); item.RemoveFromSuperview(); } pages.Clear(); pages.Add(newView); if (OnChangePage != null) { OnChangePage.Invoke(this, new EventArgs()); } }); }