void tilePages()
        {
            // Calculate which pages are visible
            var visibleBounds = pagingScrollView.Bounds;
            int firstNeededPageIndex = (int)Math.Floor(visibleBounds.GetMinX() / visibleBounds.Width);
            int lastNeededPageIndex  = (int)Math.Floor((visibleBounds.GetMaxX()-1) / visibleBounds.Width);
            firstNeededPageIndex = Math.Max(firstNeededPageIndex, 0);
            lastNeededPageIndex  = Math.Min(lastNeededPageIndex, this.imageCount - 1);

            // Recycle no-longer-visible pages
            foreach (var page in visiblePages)
            {
                if (page.index < firstNeededPageIndex || page.index > lastNeededPageIndex)
                {
                    recycledPages.Add(page);
                    page.RemoveFromSuperview();
                }
            }

            // [visiblePages minusSet:recycledPages];
            foreach (var item in recycledPages)
            {
                if (visiblePages.Contains(item))
                {
                    visiblePages.Remove(item);
                }
            }

            // add missing pages
            for (int index = firstNeededPageIndex; index <= lastNeededPageIndex; index++)
            {
                if (!this.isDisplayingPageForIndex(index))
                {
                    ImageScrollView page = this.dequeueRecycledPage();
                    if (page == null)
                    {
                        page = new ImageScrollView(frameForPageAtIndex(index));	// different from ObjC [CD]
                    }
                    this.configurePage (page, index);
                    pagingScrollView.AddSubview (page);
                    visiblePages.Add(page);
                }
            }
        }
        void configurePage(ImageScrollView page, int index)
        {
            page.index = index;
            page.Frame = this.frameForPageAtIndex (index);

            if (useTiledImage)
            {
                // Use tiled images
                page.displayTiledImageNamed (this.imageNameAtIndex (index), this.imageSizeAtIndex(index));
            }
            else
            {
                // To use full images instead of tiled images, replace the "displayTiledImageNamed:" call
                // above by the following line:
                page.displayImage (this.imageAtIndex (index));
            }
        }