图片的无限轮播难点在播放到最后一个图片时候怎么无暇接到第一张图片?
这里的解决办法就是,首先创建出三个UIImageView,分别命名为a,b,c,我们在ScrollView中看到的是b,当图片滚动到右边的c时,我们在后台悄悄的把这三个UIImageView更换掉,变为b,c,d,再将ScrollView的显示内容设置为c,酱紫我们看到的内容就不会变。这样的好处就是无论多少张图片,我们只拿三张,而且当滚动到最后一张时候,也能接上第一张。
下面我们看代码:
class ViewController: UIViewController,UIScrollViewDelegate {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var pageControl: UIPageControl!
var timer :NSTimer! //定时器
var sumArray : [String] = []
//共多少个图片
var showArray : [String] = []
//拿出三个图片
let totalCount = 5
//设置滚动的图片数量
var imageWidth = CGFloat()
//scrollView的宽度
var imageHeight = CGFloat()
//scrollView的高度
override func viewDidLoad() {
super.viewDidLoad()
imageWidth = scrollView.bounds.width
imageHeight = scrollView.bounds.height
//添加图片到数组中
for _ in 0..<totalCount {
sumArray.append("background")
}
loadImage()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//加载图片
func loadImage() {
changeShowArray()
//根据showArray提供的数据,创建三个UIImageView
for index in 0..<showArray.count {
let image = UIImageView(image: UIImage(named: showArray[index]))
image.frame = CGRect(x: CGFloat(index)*imageWidth, y: 0, width: imageWidth, height: imageHeight)
scrollView.addSubview(image)
}
scrollView.contentSize = CGSize(width: CGFloat(totalCount) * imageWidth, height: imageHeight)
scrollView.pagingEnabled = true
scrollView.showsHorizontalScrollIndicator = false
scrollView.delegate = self
//让scrollView显示在三个UIImageView的中间位置
scrollView.setContentOffset( CGPoint(x: imageWidth,y: 0), animated: false)
//设置定时器
timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("nextImage"), userInfo: nil, repeats: true)
}
//下一张图片
func nextImage() {
self.scrollView.setContentOffset( CGPoint(x: CGFloat(2) * self.imageWidth,y: 0), animated: true)
}
//当scrollView的contentOffset发生变化时调用
func scrollViewDidScroll(scrollView: UIScrollView) {
//判断是不是这个scrollView,可能存在多个scrollView的contentOffset发生变化
if scrollView != scrollView{
return
}
let x = scrollView.contentOffset.x
var page = pageControl.currentPage
//根据contentOffset.x判断page,从而获得显示内容
if x >= 2 * imageWidth {
page = (page + 1) % 5
//0的下一页 1,2,3,4,0
pageControl.currentPage = page
changeShowView()
}else if x <= 0 {
page = (page + 4) % 5
//0的上一页 4,3,2,1,0
pageControl.currentPage = page
changeShowView()
}
}
//改变showArray数组
func changeShowView() {
changeShowArray()
//获取scrollView的所有子元素(UIImageView),放在一个数组里,再从showArray里拿到数据,给UIImageView赋值
var scrollImages = scrollView.subviews as! [UIImageView]
for (index,imageStr) in showArray.enumerate() {
scrollImages[index] = UIImageView(image: UIImage(named: imageStr))
}
//所有UIImageView改变完之后,重新将scrollView显示在三个UIImageView的中间位置
scrollView.setContentOffset(CGPoint(x: imageWidth, y: 0), animated: false)
}
//改变showArray的数组
func changeShowArray() {
let page = pageControl.currentPage
//根据当前的page判断前后两个page
switch page {
case 0 :
setShowArray(sumArray.count - 1, current: page, last: page + 1)
case sumArray.count - 1 :
setShowArray(page - 1, current: page, last: 0)
default :
setShowArray(page - 1, current: page, last: page + 1)
}
}
//showArray的排列顺序添加规则
func setShowArray(frist : Int,current :Int,last : Int) {
showArray.removeAll()
showArray.append(sumArray[frist])
showArray.append(sumArray[current])
showArray.append(sumArray[last])
}
}