2015-05-29 64 views
0

我有一个分页的UIScrollView,它自动向左滚动,每隔5秒按顺序放置4个UIImage视图。当滚动视图到达第4个图像视图时,它会一直滚动回第一个图像视图并重新开始。如何制作带有图像视图的无限分页滚动视图?

什么是创建无限滚动视图幻觉的最佳方法?换句话说,而不是滚动视图可以返回,我只是希望它继续向前滚动,当它到达第4个图像视图时,它向前滚动并且图像视图#1在那里。

我以为只是重新添加图像意见和增大滚动视图的内容大小时滚动视图达到4图像但不会很聪明...... IDK的

这里是到目前为止我的代码:

我声明:

var pageImages = [UIImage]() 
var pageViews: [UIImageView?] = [] 
var scrollTimer = NSTimer() 
@IBOutlet weak var carousel: UIScrollView! 

在viewDidLoad中():

pageImages = [UIImage(named: "featured_1.png")!, 
     UIImage(named: "featured_2.png")!, 
     UIImage(named: "featured_3.png")!, 
     UIImage(named: "featured_4.png")!] 
    for _ in 0..<pageImages.count 
     pageViews.append(nil) 
} 
var pagesScrollViewSize = carousel.frame.size 

     carousel.contentSize = CGSize(width: pagesScrollViewSize.width * CGFloat(pageImages.count), 
      height: pagesScrollViewSize.height) 

loadVisiblePages() 

而由定时器调用的函数每5秒:

func scrollToImage() { 
     let x = carousel.contentOffset.x 
     if (x <= (carousel.frame.width * CGFloat(pageImages.count))/2) { 
     UIView.animateWithDuration(1, animations: { 
      self.carousel.contentOffset = CGPointMake(x+self.carousel.frame.width, 0) 
     }) 
     } else { 
     UIView.animateWithDuration(1, animations: { 
      self.carousel.contentOffset = CGPointMake(self.pageViews[0]!.frame.origin.x, 0) 
     }) 
     } 
    } 

最后的助手函数来做大量的工作:

func loadPage(page: Int) { 
     if page < 0 || page >= pageImages.count { 
      return 
     } 

     if let pageView = pageViews[page] { 

     } else { 
      var frame = carousel.bounds 
      frame.origin.x = frame.size.width * CGFloat(page) 
      frame.origin.y = 0.0 

      let newPageView = UIImageView(image: pageImages[page]) 
      newPageView.contentMode = UIViewContentMode.ScaleToFill 
      newPageView.frame = frame 
      carousel.addSubview(newPageView) 
      pageViews[page] = newPageView 
     } 
    } 

    func loadVisiblePages() { 
     let pageWidth = carousel.frame.size.width 
     let page = Int(floor((carousel.contentOffset.x * 2.0 + pageWidth)/(pageWidth * 2.0))) 

     let firstPage = page 
     let lastPage = page + 3 

     for index in firstPage...lastPage { 
      loadPage(index) 
     } 
    } 

回答

2

的想法是:

当图像在左侧从框架中移出,将其移除并重新粘贴在最右侧图像的右侧。在这一点你重置内容偏移

import UIKit 

class ViewController: UIViewController { 

    var pageViews: [UIImageView] = [] 
    var scrollTimer = NSTimer() 

    @IBOutlet weak var carousel: UIScrollView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     pageViews = [ 
      UIImageView(image:UIImage(named: "featured_1.png")!), 
      UIImageView(image:UIImage(named: "featured_2.png")!), 
      UIImageView(image:UIImage(named: "featured_3.png")!), 
      UIImageView(image:UIImage(named: "featured_4.png")!) 
     ] 
     var pagesScrollViewSize = carousel.frame.size 
     carousel.contentSize = CGSize(width: pagesScrollViewSize.width * CGFloat(pageViews.count),height: pagesScrollViewSize.height) 
     println(carousel.contentSize) 

     scrollTimer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "moveLeft", userInfo: nil, repeats: true) 
    } 

    override func viewDidAppear(animated: Bool) { 
     showPage() 
    } 

    func showPage(){ 
     carousel.setContentOffset(CGPointZero, animated: false) 
     for (index, page) in enumerate(pageViews) { 
      var frame = page.frame 
      frame.origin.x = carousel.frame.size.width * CGFloat(index) 
      frame.origin.y = 0.0 
      println(frame) 
      page.contentMode = UIViewContentMode.ScaleToFill 
      page.frame = frame 
      carousel.addSubview(page) 
     } 

    } 

    func moveLeft(){ 
     UIView.animateWithDuration(
      1.0, 
      animations: { 
       let x = self.carousel.contentOffset.x 
       self.carousel.contentOffset = CGPointMake(x + self.carousel.frame.width, 0) 
       println(self.carousel.contentOffset) 
      }, completion: {complete in 
       self.moveLeftEnd() 
      } 
     ); 
    } 

    func moveLeftEnd(){ 
     let first = pageViews.removeAtIndex(0) 
     pageViews.append(first) 
     showPage() 
    } 
} 
+0

这个,我建议你看这个[WWDC视频](https://developer.apple.com/videos/wwdc/2011/?id=104),它演示了如何达到这个效果。 – sikhapol

+0

这实际上并不奏效,但感谢您的帮助和时间!第一个图像视图滚动到下一个图像,然后滚动查看闪烁类型,然后我们回到第一个图像视图。这是第一个和第二个图像视图之间的一个不稳定的循环 – cyril

+0

我很抱歉,其中一个功能有错误,我没有看到它,因为我的所有图像看起来都一样。这现在工作100%,检查我所做的编辑,它取代了moveLeftEnd()函数。 –