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

Infinite loop scrolling using UIScrollView in Swift

我正在尝试制作一个无限循环图片库应用程序。我通过设置一个 UIScrollView 并在其中插入了 UIImageView 来做到这一点。 我可以加载 4 张图片并在它们之间滑动,但我的问题是如何实现无限滚动,以便在最后一张图片之后,第一张图片出现在对面。

由于我是 Swift 的新手,我不知道如何处理这个问题,也不知道从哪里开始。对于如何解决此问题的任何建议、示例或 link,我将不胜感激。

提前致谢!

下面是我的代码:

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)

}   

不要使用滚动视图,而是使用 table 视图或集合视图。

两个 类 的代表都想从你那里得到细胞计数。然后给代表们一个疯狂数量的单元格,一个如此之多的数字以至于任何人都不可能滚动到最后。像 9999999 个单元格。对于这样的 类 来说这不是问题,因为在后台实现中,它们实际上并没有创建如此多的单元格,而只是创建了可以在屏幕上同时显示的最大单元格数。事实上,这些细胞是被重复使用的。因此,当单元格在底部脱落时,这些单元格将在顶部重新使用,反之亦然。最后一点是:将起点设置在如此高的数字中间,例如 5555555。如果您不打算像他们那样实施完整的图像回收算法,我认为这是最简单的解决方案。

@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 )
 }

这将解决您的问题,只需将控制器调整为垂直滑动视图并按您的意愿加载资源即可。

Link

使用 Timer,您可以使用无限滚动,如下所示

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()
    }
}