コード例 #1
0
 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);
     }
 }
コード例 #2
0
        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;
        }
コード例 #3
0
        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 ();
        }
コード例 #4
0
        ItemView CoverForIndex(int index)
        {
            var coverView = DequeueReusableCover ();
            if (coverView == null)
                coverView = new ItemView (this, System.Drawing.RectangleF.Empty);
            coverView.Number = index;

            return coverView;
        }
コード例 #5
0
        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];
        }
コード例 #6
0
        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];
        }