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

Posted

技术标签:

【中文标题】在 Swift 中使用 UIScrollView 进行无限循环滚动【英文标题】:Infinite loop scrolling using UIScrollView in Swift 【发布时间】:2015-12-24 20:31:31 【问题描述】:

我正在尝试制作一个无限循环图片库应用程序。我通过设置一个在其中插入 UIImageViews 的 UIScrollView 来做到这一点。 我可以加载 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 下载一个工作项目:spin.atomicobject.com/2015/12/23/… 注意:我的方法是错误的,因为我使用了 UIViewController,而不是使用 UIPageViewController。 感谢您链接我的博文,Igor。关于您的方法,使用UIViewController 是非常可行的:该教程的后续版本最终将其包装在UIViewController 中,这样可以在UIPageViewController 之上添加其他UI 元素(在这种情况下,自定义页点和下一个按钮)。 spin.atomicobject.com/2016/02/11/move-uipageviewcontroller-dots @Jeff 不客气!感谢您和您的精彩帖子,我终于找到了解决问题的方法。继续做得很好,我将来可能需要你的更多帮助:) 【参考方案1】:

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

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

【讨论】:

感谢您的回复。我可以尝试实施您的解决方案。你有任何代码示例吗? @darko 不,但这就是您了解这个想法所需的全部内容。搜索关于 UICollectionView 或 UITableView 的教程。【参考方案2】:
@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 )
 

【讨论】:

【参考方案3】:

使用 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()
    

【讨论】:

【参考方案4】:

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

Link

【讨论】:

以上是关于在 Swift 中使用 UIScrollView 进行无限循环滚动的主要内容,如果未能解决你的问题,请参考以下文章

如何使在Swift中使用UIScrollView进行滚动和缩放

在 Swift 中使用分页向 UIScrollview 添加子视图

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

UIScrollView 在 Swift 中以编程方式

在 UIScrollview 的末尾放置一个视图 - Swift

Swift 中的 UIScrollView 内的 UIPanGesture