這兩年swift火得有點不像話,作為一個iOS開發(fā)者,Apple大大推出的編程語言是必須要學的,于是乎好多iOS攻城獅不是在用swift寫項目就是在用swift改項目的路上。我著手的項目之前一直都是用純OC編寫的,因為項目較大,而且版本更新頻率比較高,一直都沒有轉swift。趁著最近項目要發(fā)版本,手中的事不是很多,就開始試著寫一個swift版本(論裝逼的最高境界)。
Swift發(fā)布以后,一直都是看文檔,沒怎么用swift寫過項目,趁著這次機會嘗試用swift寫手中的項目。由于首頁中就有無限輪播,自然著手點也從這開始。使用兩個UIImageView+UIScrollView實現(xiàn),二話不說,先看效果圖:

先說一下原理,這里假設圖片的寬度為imgWidth,高度為imgHeight,scrollView的寬=圖片的寬,scrollView的高=圖片的高, 設置 scrollView 的 contentSize = 3倍圖片寬度,高度相同,將第一個imageView放在scrollView的中間,第二個 imageView 放在最后,因為暫時不顯示,所以放在最前面和最后面是一樣的,再設置 scrollView 的偏移量為圖片寬度(剛好顯示中間的 imageView)。具體代碼如下:
//圖片寬度
imgWidth = frame.size.width
//圖片高度
imgHeight = frame.size.height
scrollView = UIScrollView.init(frame: frame)
scrollView?.delegate = self
//設置分頁
scrollView?.pagingEnabled = true
scrollView?.showsHorizontalScrollIndicator = false
//設置 contentSize 為圖片3倍寬度,高度相同
scrollView?.contentSize = CGSizeMake(3*imgWidth!, imgHeight!)
scrollView?.contentOffset = CGPointMake(imgWidth!, 0)
self.addSubview(scrollView!)
//將當前顯示視圖放在 scrollView 中間
currentView = UIImageView.init(frame: CGRectMake(imgWidth!, 0, imgWidth!, imgHeight!))
scrollView?.addSubview(currentView!)
//下一視圖放在中間視圖后面
nextView = UIImageView.init(frame: CGRectMake(2*imgWidth!, 0, imgWidth!, imgHeight!))
scrollView?.addSubview(nextView!)
上面設置完初始數(shù)據(jù)后,接下來就要定義一個變量 direction 來記錄 scrollView 的滾動方向,這里我們先定義一個滾動方向枚舉類型:
enum Direction
{
case DirectionLeft //向左滾動
case DirectionRight //向右滾動
case DirectionNone //無滾動
}
direction是記錄 scrollView 的滾動方向的變量,它的值是根據(jù)滑動方向來改變的,所以要在 scrollView 中的代理方法監(jiān)聽 scrollView的滾動方向并賦值給direction。
//MARK: -----UIScrollViewDelegate-----
func scrollViewDidScroll(scrollView: UIScrollView)
{
let offsetX = scrollView.contentOffset.x;
self.direction = offsetX > imgWidth! ? .DirectionLeft : offsetX < imgWidth! ? .DirectionRight : .DirectionNone
}
以前在 OC中我們可以用 KVO 來實現(xiàn),但是 Swift 中沒有 KVO,所以要想到重寫 setter 方法來實現(xiàn)。
var direction :Direction = .DirectionNone //滾動方向
{
//設置新值之前
willSet
{
if newValue == direction
{
return
}
}
//設置新值之后
didSet
{
//向右滾動
if direction == .DirectionRight
{
nextView?.frame = CGRectMake(0, 0, imgWidth!, imgHeight!)
nextIndex = currentIndex!-1
if nextIndex < 0
{
nextIndex = (ADsArray?.count)! - 1
}
}
//向左滾動
if direction == .DirectionLeft
{
nextView?.frame = CGRectMake(imgWidth!*2, 0, imgWidth!, imgHeight!)
nextIndex = (currentIndex!+1) % (ADsArray?.count)!
}
nextView?.backgroundColor = ADsArray![nextIndex!]
}
}
上面代碼可以看到,在滾動方向發(fā)生變化時我們要改變 nextView 的 frame,以及它對應的圖片(這里因為是 demo,所以直接使用了color)。當滾動結束后 scrollView 會調用scrollViewDidEndDecelerating(scrollView: UIScrollView)這個方法,此時我們要改變currentView的 frame 以及它對應的圖片(即 nextView 對應的圖片)。
let offset = self.scrollView!.contentOffset.x;
let index = offset / self.imgWidth!
//1表示沒有滾動
if index == 1
{
return
}
self.currentIndex = self.nextIndex
self.pageControl?.currentPage = self.currentIndex!
self.currentView?.frame = CGRectMake(self.imgWidth!, 0, self.imgWidth!, self.imgHeight!)
self.currentView?.backgroundColor = self.nextView?.backgroundColor
self.scrollView?.contentOffset = CGPointMake(imgWidth!, 0);
關于自動輪播這里不再贅述,詳情點擊這里查看整個工程demo的實現(xiàn),如有疑問和寫的不好的地方還望各位多多包涵,也歡迎指正,如果對您確實產(chǎn)生了有利的影響也希望您能賞個star!!!