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

时间:2015-12-24 20:31:31

标签: ios swift uiscrollview uiimageview infinite-loop

我正在尝试制作一个无限循环图片库应用。我通过设置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)

}   

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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 )
 }

答案 2 :(得分:0)

这将解决您的问题,只需调整控制器进入垂直幻灯片视图并随意加载资源。

Link

答案 3 :(得分: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()
    }
}