void UpdateCoverImage(ItemView aCover) { UIImage coverImage; if (coverImages.TryGetValue (aCover.Number, out coverImage)){ if (coverImageHeights.ContainsKey (aCover.Number)) aCover.SetImage (coverImage, coverImageHeights [aCover.Number], kReflectionFraction); } else { aCover.SetImage (defaultImage, defaultImageHeight, kReflectionFraction); if (dataSource != null) dataSource.RequestImage (this, aCover.Number); } }
void SetupInitialState() { if (dataSource != null) defaultImage = dataSource.GetDefaultImage (); scrollView = new UIScrollView (Frame) { UserInteractionEnabled = false, MultipleTouchEnabled = false, AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth }; AddSubview (scrollView); MultipleTouchEnabled = false; UserInteractionEnabled = true; AutosizesSubviews = true; Layer.Position = new System.Drawing.PointF ((float)(Frame.Size.Width / 2), (float)(Frame.Height / 2)); // Initialize the visible and selected cover range. lowerVisibleCover = upperVisibleCover = -1; selectedCoverView = null; // Set up transforms UpdateTransforms (); // Set some perspective var sublayerTransform = CATransform3D.Identity; sublayerTransform.m34 = -0.01f; scrollView.Layer.SublayerTransform = sublayerTransform; Bounds = Frame; }
void LayoutCover(ItemView aCover, int selectedIndex, bool animated) { int coverNumber = aCover.Number; CATransform3D newTransform; float newZPosition = sideCoverPosition; PointF newPosition = new PointF (halfScreenWidth + aCover.HorizontalPosition, halfScreenHeight + aCover.VerticalPosition); if (coverNumber < selectedIndex){ newPosition.X -= centerCoverOffset; newTransform = leftTransform; } else if (coverNumber > selectedIndex){ newPosition.X += centerCoverOffset; newTransform = rightTransform; } else { newZPosition = 0; newTransform = CATransform3D.Identity; } if (animated){ BeginAnimations (null); SetAnimationCurve (UIViewAnimationCurve.EaseOut); SetAnimationBeginsFromCurrentState (true); // fixed typo Curren -> Current } aCover.Layer.Transform = newTransform; aCover.Layer.ZPosition = newZPosition; aCover.Layer.Position = newPosition; if (animated) CommitAnimations (); }
ItemView CoverForIndex(int index) { var coverView = DequeueReusableCover (); if (coverView == null) coverView = new ItemView (this, System.Drawing.RectangleF.Empty); coverView.Number = index; return coverView; }
public void SetSelectedCover(int newSelectedCover) { if (selectedCoverView != null && (newSelectedCover == selectedCoverView.Number)) return; int newLowerBound = Math.Max (0, newSelectedCover - kCoverBuffer); int newUpperBound = Math.Min (numberOfImages - 1, newSelectedCover + kCoverBuffer); if (selectedCoverView == null){ // Allocate and display covers from newLower to newUYpper bounds. for (int i = newLowerBound; i <= newUpperBound; i++){ var cover = CoverForIndex (i); onscreenCovers [i] = cover; UpdateCoverImage (cover); scrollView.Layer.AddSublayer (cover.Layer); LayoutCover (cover, newSelectedCover, false); } lowerVisibleCover = newLowerBound; upperVisibleCover = newUpperBound; selectedCoverView = onscreenCovers [newSelectedCover]; return; } // Check to see if the new and current ranges overlap if ((newLowerBound > upperVisibleCover) || (newUpperBound < lowerVisibleCover)){ // They do not overlap at all // This does not animate -- assuming it's programmatically set from view controller. // Recycle all onscreen covers. for (int i = lowerVisibleCover; i <= upperVisibleCover; i++){ var cover = onscreenCovers [i]; offscreenCovers.Push (cover); cover.RemoveFromSuperview (); onscreenCovers.Remove (i); } // Move all available covers to new location for (int i = newLowerBound; i <= newUpperBound; i++){ var cover = CoverForIndex (i); onscreenCovers [i] = cover; UpdateCoverImage (cover); scrollView.Layer.AddSublayer (cover.Layer); } lowerVisibleCover = newLowerBound; upperVisibleCover = newUpperBound; selectedCoverView = onscreenCovers [newSelectedCover]; LayoutCovers (newSelectedCover, newLowerBound, newUpperBound); return; } else if (newSelectedCover > selectedCoverView.Number){ for (int i = lowerVisibleCover; i < newLowerBound; i++){ var cover = onscreenCovers [i]; if (upperVisibleCover < newUpperBound){ // Tack it on right side upperVisibleCover++; cover.Number = upperVisibleCover; UpdateCoverImage (cover); onscreenCovers [cover.Number] = cover; LayoutCover (cover, newSelectedCover, false); } else { // Recycle this cover offscreenCovers.Push (cover); cover.RemoveFromSuperview (); } onscreenCovers.Remove (i); } lowerVisibleCover = newLowerBound; // Add in any missing covers on the right up to the newUpperBound. for (int i = upperVisibleCover+1; i <= newUpperBound; i++){ var cover = CoverForIndex (i); onscreenCovers [i] = cover; UpdateCoverImage (cover); scrollView.Layer.AddSublayer (cover.Layer); LayoutCover (cover, newSelectedCover, false); } upperVisibleCover = newUpperBound; } else { // Move covers that are now out of range on the right to the left side. // but only if appropriate (within the range set by newLoweBound). for (int i = upperVisibleCover; i > newUpperBound; i--){ var cover = onscreenCovers [i]; if (lowerVisibleCover > newLowerBound){ // Tack it on the left lowerVisibleCover--; cover.Number = lowerVisibleCover; UpdateCoverImage (cover); onscreenCovers [lowerVisibleCover] = cover; LayoutCover (cover, newSelectedCover, false); } else { // Recycle this cover offscreenCovers.Push (cover); cover.RemoveFromSuperview (); } } upperVisibleCover = newUpperBound; // Add in any missing covers on the left down to the newLowerBound for (int i = lowerVisibleCover - 1; i >= newLowerBound; i--){ var cover = CoverForIndex (i); onscreenCovers [i] = cover; UpdateCoverImage (cover); scrollView.Layer.AddSublayer (cover.Layer); LayoutCover (cover, newSelectedCover, false); } lowerVisibleCover = newLowerBound; } if (selectedCoverView.Number > newSelectedCover) LayoutCovers (newSelectedCover, newSelectedCover, selectedCoverView.Number); else if (newSelectedCover > selectedCoverView.Number) LayoutCovers (newSelectedCover, selectedCoverView.Number, newSelectedCover); selectedCoverView = onscreenCovers [newSelectedCover]; }
public void SetSelectedCover(int newSelectedCover) { if (selectedCoverView != null && (newSelectedCover == selectedCoverView.Number)) { return; } int newLowerBound = Math.Max(0, newSelectedCover - kCoverBuffer); int newUpperBound = Math.Min(numberOfImages - 1, newSelectedCover + kCoverBuffer); if (selectedCoverView == null) { // Allocate and display covers from newLower to newUYpper bounds. for (int i = newLowerBound; i <= newUpperBound; i++) { var cover = CoverForIndex(i); onscreenCovers [i] = cover; UpdateCoverImage(cover); scrollView.Layer.AddSublayer(cover.Layer); LayoutCover(cover, newSelectedCover, false); } lowerVisibleCover = newLowerBound; upperVisibleCover = newUpperBound; selectedCoverView = onscreenCovers [newSelectedCover]; return; } // Check to see if the new and current ranges overlap if ((newLowerBound > upperVisibleCover) || (newUpperBound < lowerVisibleCover)) { // They do not overlap at all // This does not animate -- assuming it's programmatically set from view controller. // Recycle all onscreen covers. for (int i = lowerVisibleCover; i <= upperVisibleCover; i++) { var cover = onscreenCovers [i]; offscreenCovers.Push(cover); cover.RemoveFromSuperview(); onscreenCovers.Remove(i); } // Move all available covers to new location for (int i = newLowerBound; i <= newUpperBound; i++) { var cover = CoverForIndex(i); onscreenCovers [i] = cover; UpdateCoverImage(cover); scrollView.Layer.AddSublayer(cover.Layer); } lowerVisibleCover = newLowerBound; upperVisibleCover = newUpperBound; selectedCoverView = onscreenCovers [newSelectedCover]; LayoutCovers(newSelectedCover, newLowerBound, newUpperBound); return; } else if (newSelectedCover > selectedCoverView.Number) { for (int i = lowerVisibleCover; i < newLowerBound; i++) { var cover = onscreenCovers [i]; if (upperVisibleCover < newUpperBound) { // Tack it on right side upperVisibleCover++; cover.Number = upperVisibleCover; UpdateCoverImage(cover); onscreenCovers [cover.Number] = cover; LayoutCover(cover, newSelectedCover, false); } else { // Recycle this cover offscreenCovers.Push(cover); cover.RemoveFromSuperview(); } onscreenCovers.Remove(i); } lowerVisibleCover = newLowerBound; // Add in any missing covers on the right up to the newUpperBound. for (int i = upperVisibleCover + 1; i <= newUpperBound; i++) { var cover = CoverForIndex(i); onscreenCovers [i] = cover; UpdateCoverImage(cover); scrollView.Layer.AddSublayer(cover.Layer); LayoutCover(cover, newSelectedCover, false); } upperVisibleCover = newUpperBound; } else { // Move covers that are now out of range on the right to the left side. // but only if appropriate (within the range set by newLoweBound). for (int i = upperVisibleCover; i > newUpperBound; i--) { var cover = onscreenCovers [i]; if (lowerVisibleCover > newLowerBound) { // Tack it on the left lowerVisibleCover--; cover.Number = lowerVisibleCover; UpdateCoverImage(cover); onscreenCovers [lowerVisibleCover] = cover; LayoutCover(cover, newSelectedCover, false); } else { // Recycle this cover offscreenCovers.Push(cover); cover.RemoveFromSuperview(); } } upperVisibleCover = newUpperBound; // Add in any missing covers on the left down to the newLowerBound for (int i = lowerVisibleCover - 1; i >= newLowerBound; i--) { var cover = CoverForIndex(i); onscreenCovers [i] = cover; UpdateCoverImage(cover); scrollView.Layer.AddSublayer(cover.Layer); LayoutCover(cover, newSelectedCover, false); } lowerVisibleCover = newLowerBound; } if (selectedCoverView.Number > newSelectedCover) { LayoutCovers(newSelectedCover, newSelectedCover, selectedCoverView.Number); } else if (newSelectedCover > selectedCoverView.Number) { LayoutCovers(newSelectedCover, selectedCoverView.Number, newSelectedCover); } selectedCoverView = onscreenCovers [newSelectedCover]; }