最近在練習(xí)swift匹涮,偶然看到一個輪播的demo钝侠,之前在oc里,輪播直接想到的就是三方SDCycleScrollView握侧,也沒有研究過原理责嚷。
現(xiàn)在移到swift里了看到demo鸳兽,就研究了一下輪播的原理,其實挺簡單的罕拂。下面進入正文吧
核心構(gòu)造控件:
var bgScrollView = UIScrollView()
let imageName : [String] = ["1","2"]//輪播內(nèi)容
var leftImage,middleImage,rightImage:UIImageView?//輪播控件
var autoTime : Timer?//自動輪播計時器
var page = UIPageControl()//小圓點控件
let w = UIScreen.main.bounds.size.width//輪播控件寬
var index = 0//當(dāng)前輪播到第幾內(nèi)容
UIScrollView是滑動試圖的基礎(chǔ)揍异,使用三個控件來搭載輪播內(nèi)容分為左中右三個,層級關(guān)系如圖
輪播控件內(nèi)容設(shè)置方法:
func setImage() {
if index == 0{
leftImage?.image = UIImage(named: self.imageName.last!)
middleImage?.image = UIImage(named: self.imageName.first!)
rightImage?.image = UIImage(named: self.imageName[1])
}else if index == self.imageName.count - 1 {
leftImage?.image = UIImage(named: self.imageName[index - 1])
middleImage?.image = UIImage(named: self.imageName.last!)
rightImage?.image = UIImage(named: self.imageName.first!)
}else{
leftImage?.image = UIImage(named: self.imageName[index - 1])
middleImage?.image = UIImage(named: self.imageName[index])
rightImage?.image = UIImage(named: self.imageName[index + 1])
}
}
輪播的起始狀態(tài)為顯示中間的輪播控件爆班,假設(shè)輪播控件寬度為w則控件內(nèi)容的初始狀態(tài)應(yīng)為這樣
復(fù)用的核心方法:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let contentOffX = scrollView.contentOffset.x
if imageName.count > 0 {
if (contentOffX >= 2 * w){
bgScrollView.contentOffset = CGPoint(x: w, y: 0)
index += 1
if index == imageName.count{
index = 0
}
}
if (contentOffX <= 0){
bgScrollView.contentOffset = CGPoint(x: w, y: 0)
index -= 1
if index == -1{
index = imageName.count - 1;
}
}
setImage()
page.currentPage = index
}
}
輪播核心邏輯為:通過復(fù)用控件衷掷,利用定時器不斷的循環(huán)調(diào)用方法來實現(xiàn)輪播效果。首先來解釋簡單的復(fù)用原理蛋济,核心為在展示了即將輪播的內(nèi)容后調(diào)整scrollview的contentoffset棍鳖,所以復(fù)用方法應(yīng)該寫在scrollViewDidScroll里炮叶。下面舉例簡單解釋一下復(fù)用核心方法:例如在我們展示輪播內(nèi)容的第一個后碗旅,假設(shè)我們向左滑,那么我們即將看到的是輪播內(nèi)容的第二個镜悉,在完全展示了第二個輪播內(nèi)容的時候祟辟,scrollview的X軸偏移量變成2*w,此時調(diào)整scrollview的X方向的contentoffset變?yōu)閣侣肄。那么此時我們已經(jīng)偷偷的將右控件調(diào)整為了中控件旧困。因為你會發(fā)現(xiàn)此時展示的控件的frame是中間控件的frame,這樣我們的控件相對布局就有回到了初始狀態(tài)稼锅,相當(dāng)于我們始終在展示中間控件吼具,這樣我們就實現(xiàn)了復(fù)用效果。然后我們再調(diào)整輪播控件展示的內(nèi)容矩距,
利用定時器:
func autoCycle() {
autoTime = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(auto), userInfo: nil, repeats: true)
}
@objc func auto() {
let contentOffsetX = CGPoint(x: w * 2, y: 0)
bgScrollView.setContentOffset(contentOffsetX, animated: true)
}
不斷的重復(fù)第二個控件開始的偏移位置w到第二個控件結(jié)束的位置2*w拗盒,從而達到輪播效果。