Swift實(shí)現(xiàn)無(wú)限輪播效果
從今天開(kāi)始,我學(xué)習(xí)的重點(diǎn)開(kāi)始轉(zhuǎn)向Swift,并且會(huì)分享一些自己學(xué)習(xí)的心得體會(huì),今天給大家?guī)?lái)的的是無(wú)限輪播。廣告頁(yè)的無(wú)限輪播是非常常見(jiàn)的一個(gè)功能,大多數(shù)APP都有,大多數(shù)程序員也都實(shí)現(xiàn)過(guò),今天我們用Swift實(shí)現(xiàn)一下。項(xiàng)目地址
圖片切換我們可以選擇的基本控件有兩個(gè)UIScrollView 和 UICollectionView,這次我們選擇UICollectionView;既然是輪播,就會(huì)用到Timer。所以,我們這次主要應(yīng)用的知識(shí)點(diǎn)為UICollectionView 和 Timer;
import UIKit class CycleScrollView: UIView, UICollectionViewDelegate,UICollectionViewDataSource { var bottomView : UICollectionView? var width : CGFloat? var height : CGFloat? var timer : Timer? override init(frame: CGRect){ super.init(frame: frame) // 1.設(shè)置背景色 self.backgroundColor = UIColor.clear // 2.設(shè)置寬高 width = self.frame.size.width height = self.frame.size.height // 3.添加bottomView setupBottomView() // 4.添加定時(shí)器 setupTimer() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setupBottomView() { // 5.設(shè)置collectionView的布局 let flowLayout = UICollectionViewFlowLayout(); flowLayout.itemSize = self.bounds.size flowLayout.minimumLineSpacing = 0; flowLayout.minimumInteritemSpacing = 0; flowLayout.scrollDirection = UICollectionViewScrollDirection.horizontal; bottomView = UICollectionView.init(frame: self.bounds, collectionViewLayout: flowLayout) self.addSubview(bottomView!); // 6.設(shè)置collectionView的尺寸 bottomView?.contentSize = CGSize(width:width! * CGFloat(4),height:height!) // 7.分頁(yè) bottomView?.isPagingEnabled = true // 8.去掉滾動(dòng)條 bottomView?.showsVerticalScrollIndicator = false bottomView?.showsHorizontalScrollIndicator = false // 9.設(shè)置代理 bottomView?.delegate = self bottomView?.dataSource = self // 10.注冊(cè)cell bottomView?.register(UICollectionViewCell().classForCoder, forCellWithReuseIdentifier: "ID"); if #available(iOS 10.0, *) { // 11.預(yù)加載 bottomView?.isPrefetchingEnabled = true } else { // Fallback on earlier versions } } func setupTimer() { // 12.實(shí)例化定時(shí)器 timer = Timer.init(timeInterval: 2, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true); RunLoop.main.add(timer!, forMode: RunLoopMode.defaultRunLoopMode); DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) { self.timer?.fire(); } } func timerAction() { var contentOffsetX = (self.bottomView?.contentOffset.x)! + self.frame.size.width if contentOffsetX > self.frame.size.width * 3 { // 當(dāng)前視圖顯示的是第三個(gè)的時(shí)候,設(shè)置bottomView的偏移量為0 self.bottomView?.contentOffset = CGPoint(x:0,y:0) contentOffsetX = self.frame.size.width } self.bottomView?.setContentOffset(CGPoint(x:contentOffsetX,y:0), animated: true) } // 重寫(xiě)removeFromSuperview方法,用于刪除定時(shí)器,否則定時(shí)器一直存在,浪費(fèi)內(nèi)存 override func removeFromSuperview() { timer?.invalidate() timer = nil super.removeFromSuperview() } // Mark:UICollectionViewDataSource // 設(shè)置Itmes func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 4; } // 設(shè)置cell func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell : UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "ID", for: indexPath) for view : UIView in cell.contentView.subviews { view.removeFromSuperview() } let imageView = UIImageView.init(frame: cell.contentView.bounds) if indexPath.row < 3 { imageView.image = UIImage.init(named: String(indexPath.row)) } else { imageView.image = UIImage.init(named: String(0)) } cell.contentView.addSubview(imageView) return cell; } // Mark:UICollectionViewDelegate // 點(diǎn)擊方法 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { print("您點(diǎn)擊了第 \(indexPath.row == 3 ? 0 : indexPath.row) 個(gè)"); } }
UICollectionView 和 Timer的用法和OC基本相同。Swift和OC的UI部分應(yīng)該是一致的,因?yàn)榈讓佣际荗penGL。我直接說(shuō)一下區(qū)別:
1.Timer:如果重復(fù),OC是等一個(gè)間隔再執(zhí)行的,Swift是立即執(zhí)行的,所以我用了GCD延時(shí)開(kāi)啟定時(shí)器。
2.Swift 沒(méi)有 CGPointZero。
無(wú)限輪播的原理就是在最后面多添加一個(gè)和第一個(gè)相同的itme。當(dāng)你滑動(dòng)到最后一個(gè)itme時(shí),把UICollectionView的contentOffset置零,繼續(xù)向右活動(dòng)。如果不添加,會(huì)給用戶(hù)一種卡頓的感覺(jué)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Swift與Objective C的簡(jiǎn)單對(duì)比
很多人想學(xué)習(xí)iOS開(kāi)發(fā),但是不知道如何從Objective-C和Swift之間選擇。而網(wǎng)上的一些答案,大抵說(shuō)的是,以后Swift終將取代Objective-C,但是目前來(lái)講還是Objective-C比較重要。那么究竟怎樣呢,今天我們就來(lái)探討下2016-12-12Swift語(yǔ)言實(shí)現(xiàn)地圖坐標(biāo)彈跳動(dòng)畫(huà)
這篇文章主要介紹了用Swift語(yǔ)言實(shí)現(xiàn)地圖坐標(biāo)彈跳動(dòng)畫(huà)的方法主要應(yīng)用iOS7來(lái)實(shí)現(xiàn)此功能,需要的朋友可以參考下2015-07-07Swift使用Cocoa中的數(shù)據(jù)類(lèi)型教程
這篇文章主要介紹了Swift使用Cocoa中的數(shù)據(jù)類(lèi)型教程,Swift 會(huì)自動(dòng)將一些 Objective-C 類(lèi)型轉(zhuǎn)換為 Swift 類(lèi)型,以及將 Swift 類(lèi)型轉(zhuǎn)換為 Objective-C 類(lèi)型,需要的朋友可以參考下2014-07-07Swift中switch語(yǔ)句區(qū)間和元組模式匹配
這篇文章主要介紹了Swift中switch語(yǔ)句區(qū)間和元組模式匹配的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12詳解Swift的switch...case語(yǔ)句中break關(guān)鍵字的用法
這篇文章主要介紹了Swift的switch...case語(yǔ)句中break關(guān)鍵字的用法,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-04-04Swift、Objective-C、Cocoa混合編程設(shè)置指南
這篇文章主要介紹了Swift、Objective-C、Cocoa混合編程設(shè)置指南,需要的朋友可以參考下2014-07-07Swift編程中的switch...case語(yǔ)句實(shí)例解析
這篇文章主要介紹了Swift編程中的switch...case語(yǔ)句實(shí)例解析,其中重點(diǎn)還是對(duì)于fallthrough關(guān)鍵字用法的講解,需要的朋友可以參考下2016-04-04Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法
這篇文章主要介紹了關(guān)于在Swift中將UILabel數(shù)字顏色設(shè)置為紅色的方法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03Swift中內(nèi)置的集合類(lèi)型學(xué)習(xí)筆記
Swift中自帶數(shù)組、set、字典三大集合類(lèi)型,這里將學(xué)習(xí)過(guò)程中的基礎(chǔ)的Swift中內(nèi)置的集合類(lèi)型學(xué)習(xí)筆記進(jìn)行整理,需要的朋友可以參考下2016-06-06