圖片的無限輪播難點在播放到最後一個圖片時候怎麼無暇接到第一張圖片?
這裏的解決辦法就是,首先創建出三個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])
}
}