在Swift中使用UIScrollView实现无限循环滚动

7
我正在尝试创建一个无限循环的图库应用。我通过设置UIScrollView并在其中插入UIImageViews来实现它。我能够加载4张图片并在它们之间滑动,但我的问题是如何实现无限滚动,以便在最后一张图片之后,第一张图片出现,反之亦然。
由于我是Swift的新手,我不知道如何处理这个问题,也不知道从哪里开始。我将感激任何关于如何解决此问题的建议、示例或链接。
在这里是我的代码片段:
class FirstViewController: UIViewController {

@IBOutlet weak var scrollView: UIScrollView!

override func viewDidLoad() {
    super.viewDidLoad()

    self.scrollView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)

    let scrollViewWidth: CGFloat = self.scrollView.frame.width
    let scrollViewHeight: CGFloat = self.scrollView.frame.height

    let numPics: Int = 3

    let imgOne = UIImageView()
    let imgTwo = UIImageView()
    let imgThree = UIImageView()
    let imgFour = UIImageView()

    var arrPics = [imgOne, imgTwo, imgThree, imgFour]
    var arrSlide = ["slide1.png", "slide2.png", "slide3.png", "slide4.png"]

    for i in 0...numPics {

        arrPics[i] = UIImageView(frame: CGRectMake(0,scrollViewHeight * CGFloat(i),scrollViewWidth, scrollViewHeight))

        arrPics[i].image = UIImage(named: arrSlide[i])

        self.scrollView.addSubview(arrPics[i])

        }

    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.width, self.scrollView.frame.height*4)

}   

这里是一个教程链接,展示了如何在页面之间创建无限循环的最佳方法。您可以在此处找到详细的教程,并从github下载一个可工作的项目:http://spin.atomicobject.com/2015/12/23/swift-uipageviewcontroller-tutorial/ 注意:我的方法是错误的,因为我使用了UIViewController,而不是使用UIPageViewController。 - Igor Ani
谢谢你链接我的博客文章,Igor。关于你的方法,使用UIViewController非常可行:该教程的后继者最终将其包装在UIViewController中,这样其他UI元素可以添加到UIPageViewController之上(在本例中,是自定义页面点和下一个按钮)。https://spin.atomicobject.com/2016/02/11/move-uipageviewcontroller-dots/ - Jeff
@Jeff 不客气!感谢你和你的优秀帖子,我终于找到了解决我的问题的方法。继续做好工作,我将来可能还需要你的帮助 :) - Igor Ani
4个回答

1
不要使用滚动视图,而是使用表格视图或集合视图。这两个类的代理需要您提供单元格计数。然后给代理一个非常大的单元格数,一个如9999999这样完全不可能滚动到底部的数字。对于这些类来说,这并不是问题,因为在后台实现中,它们并没有真正创建这么多的单元格,只创建了屏幕上可见的最大数量的单元格。实际上,单元格是被重用的。因此,当单元格从底部掉出时,这些单元格将被重新使用,并相反地。最后一点是:将起始点设置在这么高的数字的中间,例如5555555。我认为这是最简单的解决方案,如果您不打算实现像他们做的完整图像回收算法。

2
谢谢回复。我可以尝试实现您的解决方案。您有任何代码示例吗?@darko - Igor Ani
不是,但这已经足够让你了解。搜索有关UICollectionView或UITableView的教程即可。 - Darko

0
使用定时器,您可以像下面这样使用无限滚动。
func showview() {

    if(videosimageslider.isEmpty) {
        // print("Empty Array")
    } else {
        // print("Not Empty ")
        // print(videosimageslider.count)

        for var index=0; index<videosimageslider.count; index++ {
            if let url = NSURL(string: videosimageslider[index]) {
                if let data = NSData(contentsOfURL: url){
                    if let imageUrl = UIImage(data: data) {
                        let  myimageview:UIImageView = UIImageView()
                        // myimageview.image = imageUrl
                        let block: SDWebImageCompletionBlock! = {(image: UIImage!, error: NSError!, cacheType: SDImageCacheType, imageUrl: NSURL!) -> Void in
                            //println(self)
                        }

                        // let url = NSURL(string: "http://yikaobang-test.u.qiniudn.com/FnZTPYbldNXZi7cQ5EJHmKkRDTkj")
                        myimageview.sd_setImageWithURL(url, completed: block)
                        myimageview.frame.size.width = imagewidth
                        myimageview.frame.size.height = imageheight
                        myimageview.contentMode = UIViewContentMode.ScaleToFill
                        myimageview.frame.origin.x = xscrollpos
                        myimageview.frame.origin.y = 5
                        scrollview!.addSubview(myimageview)
                        xscrollpos += imagewidth
                        scrollviewcontentSize += imagewidth
                        scrollview.contentSize = CGSize(width: scrollviewcontentSize, height: imageheight)
                    }
                }
            }
        }
        scrollingTimer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "newStartScrolling", userInfo: nil, repeats: true)
        scrollingTimer.fire()
    }
}

// call the timer function //
func newStartScrolling() {
    var currentOffset = scrollview.contentOffset
    currentOffset = CGPointMake(currentOffset.x+3, currentOffset.y )

    if(currentOffset.x < scrollview.contentSize.width - 500) {
        scrollview.setContentOffset(currentOffset, animated: false)
        currentOffset = CGPointMake(0, currentOffset.y )
        //scrollview.contentSize = CGSize(width: 0, height: 0);
    } else {
        scrollingTimer.invalidate()
        showview()
    }
}

0
@IBOutlet weak var scrollView: UIScrollView!
var scrollViewHeight: CGFloat!
let numPics: Int = 4


override func viewDidLoad()
{
  super.viewDidLoad()

  scrollView.delegate = self
  self.scrollView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)

  let scrollViewWidth: CGFloat = self.scrollView.frame.width
  scrollViewHeight = self.scrollView.frame.height



  let imgOne = UIImageView()
  let imgTwo = UIImageView()
  let imgThree = UIImageView()
  let imgFour = UIImageView()
  let imgFive = UIImageView()


  var arrPics = [imgOne, imgTwo, imgThree, imgFour,imgFive]
  var arrSlide = ["slide1.jpeg", "slide1.jpeg", "slide1.jpeg", "slide1.jpeg","slide1.jpeg"]

  for i in 0...numPics {

     arrPics[i] = UIImageView(frame: CGRectMake(0,scrollViewHeight * CGFloat(i),scrollViewWidth, scrollViewHeight))

     arrPics[i].image = UIImage(named: arrSlide[i])

     self.scrollView.addSubview(arrPics[i])

   }

  self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.width, self.scrollView.frame.height * CGFloat(numPics+1))

}

 func scrollViewDidScroll(scrollView: UIScrollView)
 {
     scrollViewHeight = self.scrollView.frame.height
    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.width, self.scrollView.frame.height * scrollViewHeight )
 }

-1

这就是能解决你问题的方法,只需将控制器调整为垂直滑动视图,并按照你的意愿加载资源。

链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接