用Swift創建圖片輪播器和用OC創建的方式是一樣的,都主要用到UIScrollView和UIImageview這兩個控件,有幾張圖片,就將滾動視圖的內容區域大小設置為每一張圖片的大小乘以張數即可。然后允許實現分頁功能pagingEnabled,最后給對應區域的滾動視圖設置相應的圖片即可。
聲明必要的屬性
private var image :UIImage?
private var timer :NSTimer?
創建滾動視圖并設置相關屬性
// 創建滾動視圖并設置相關屬性
lazy var scollView :UIScrollView? = {
let scollView = UIScrollView(frame: CGRectMake(10, 50, 300, 130))
// 設置UIScrollView的contentSize(內容的實際大小)
let maxW:CGFloat = scollView.frame.size.width * 5
scollView.contentSize = CGSizeMake(maxW,0)
// 實現UIScrollView的分頁效果
scollView.pagingEnabled = true
scollView.delegate = self
// 隱藏水平滾動指示器
scollView.showsHorizontalScrollIndicator = false
return scollView
}()
創建分頁控制并設置相關屬性
lazy var pageControl :UIPageControl? = {
// 創建分頁控制并設置相關屬性
let pageControl = UIPageControl(frame: CGRectMake(100,140,120,37))
// 指定UIPageControl的總頁數
pageControl.numberOfPages = 5
// 指定默認是第0頁
pageControl.currentPage = 0
pageControl.currentPageIndicatorTintColor = UIColor.redColor()
pageControl.pageIndicatorTintColor = UIColor.blueColor()
return pageControl
}()
創建圖像視圖并設置圖片
// 創建圖像視圖并設置圖片
let imgW:CGFloat = 300
let imgH:CGFloat = 130
let imgY:CGFloat = 0
// 循環創建5個UIImageView到UIScrollView中
for i in 0..<5 {
// 設置UIImageView中的圖片
self.image = UIImage(named: "img_0\(i+1).png")
// 計算每個UIImageView在UIScrollView中的x值
let imgX:CGFloat = CGFloat(i) * imgW
// 設置imgView的frame
let imageView:UIImageView? = UIImageView(frame: CGRectMake(imgX,imgY,imgW,imgH))
imageView?.image = self.image
imageView?.contentMode = .ScaleAspectFit
imageView?.clipsToBounds = true
self.scollView?.addSubview(imageView!)
}
創建定時器實現圖片自動輪播
// 創建定時器實現圖片自動輪播
timer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "scrollImage:", userInfo: nil, repeats: true)
// 修改self.timer的優先級與控件一樣
// 獲取當前的消息循環對象
let runloop:NSRunLoop = NSRunLoop.currentRunLoop()
// 改變self.timer對象的優先級
runloop.addTimer(self.timer!, forMode: NSRunLoopCommonModes)
實現定時器的方法
// 實現定時器的方法
func scrollImage(sender:AnyObject) {
// 獲取當前的UIPageControl的頁碼
var page:Int = self.pageControl!.currentPage
// 判斷頁碼是否到了最后一頁,如果到了最后一頁,那么設置頁碼為0(回到第一頁),如果沒有到達最后一頁,則讓頁碼+1
if page == self.pageControl!.numberOfPages - 1 {
page = 0
} else {
page++
}
// 用每頁的寬度 * (頁碼 + 1) 計算出了下一頁的contentOffset
let offsetX:CGFloat = (CGFloat)(page) * self.scollView!.frame.size.width
// 設置UIScrollView的contentOffset等于新的偏移的值
self.scollView!.contentOffset = CGPointMake(offsetX,0)
}
UIScrollViewDelegate
// MARK: - UIScrollViewDelegate
extension ViewController :UIScrollViewDelegate {
// 實現UIScrollView的滾動方法
func scrollViewDidScroll(scrollView: UIScrollView) {
// 要在這里根據當前的滾動來計算當前是第幾頁
// 獲取scrollView的x方向的偏移值
var offsexX:CGFloat = scrollView.contentOffset.x
// 用已經偏移了的值,加上半頁的寬度
offsexX = offsexX + (scollView!.frame.size.width * 0.5)
// 用x方向的偏移的值除以一張圖片的寬度(每一頁的寬度),取商就是當前滾到了第幾頁(索引)
let pagenumber:CGFloat = offsexX / self.scollView!.frame.size.width
// 將頁碼設置給UIPageControl
self.pageControl!.currentPage = (Int)(pagenumber)
}
// 即將開始拖拽的方法
func scrollViewWillBeginDragging(scrollView: UIScrollView) {
// 調用invalidate一旦停止計時器,那么這個計時器就不可再重用了,下次必須重新創建一個新的計時器對象.
self.timer?.invalidate()
// 因為當調用完畢invalidate方法以后,這個計時器對象就已經廢了,無法重用了,所以可以直接將self.timer設置為nil
self.timer = nil
}
// 拖拽完畢的方法
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
// 重新啟動計時器
timer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "scrollImage:", userInfo: nil, repeats: true)
// 再次修改一下新創建的timer的優先級
let runloop:NSRunLoop = NSRunLoop.currentRunLoop()
runloop.addTimer(self.timer!, forMode: NSRunLoopCommonModes)
}
}
Banner
banner01.jpg
banner02.jpg
banner03.jpg
banner04.jpg