【问题标题】:Infinite loop scrolling using UIScrollView in Swift在 Swift 中使用 UIScrollView 进行无限循环滚动
【发布时间】: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 不客气!感谢您和您的精彩帖子,我终于找到了解决问题的方法。继续做得很好,我将来可能需要你的更多帮助:)

标签: ios swift uiscrollview uiimageview infinite-loop


【解决方案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

      【讨论】:

        猜你喜欢
        • 2012-10-04
        • 2015-10-03
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 2017-01-17
        • 1970-01-01
        相关资源
        最近更新 更多