最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift實(shí)現(xiàn)無(wú)限輪播效果

 更新時(shí)間:2017年03月10日 14:22:27   作者:豆丶漿油條  
這篇文章主要為大家詳細(xì)介紹了Swift無(wú)限輪播效果實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

從今天開(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的開(kāi)發(fā)環(huán)境搭建以及基本語(yǔ)法詳解

    Swift的開(kāi)發(fā)環(huán)境搭建以及基本語(yǔ)法詳解

    這篇文章主要介紹了Swift的開(kāi)發(fā)環(huán)境搭建以及基本語(yǔ)法詳解,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • IOS 實(shí)現(xiàn)簡(jiǎn)單的彈幕功能

    IOS 實(shí)現(xiàn)簡(jiǎn)單的彈幕功能

    本文主要介紹IOS 實(shí)現(xiàn)彈幕功能,這里給大家一個(gè)實(shí)例來(lái)展現(xiàn)彈幕功能,有需要的小伙伴可以參考下
    2016-07-07
  • Swift 4.0中如何引用3.0的第三方庫(kù)

    Swift 4.0中如何引用3.0的第三方庫(kù)

    這篇文章主要給大家介紹了關(guān)于在Swift 4.0中如何引用3.0第三方庫(kù)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Swift hello world!Swift快速入門(mén)教程

    Swift hello world!Swift快速入門(mén)教程

    這篇文章主要介紹了Swift hello world!Swift快速入門(mén)教程,本文在快速了解Swift編程語(yǔ)言,需要的朋友可以參考下
    2014-07-07
  • SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例

    SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例

    緩存就是一個(gè)存儲(chǔ)器,常用 Redis作為緩存數(shù)據(jù)庫(kù),本文主要介紹了SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 淺談Swift派發(fā)機(jī)制

    淺談Swift派發(fā)機(jī)制

    派發(fā)目的是讓 CPU 知道被調(diào)用的函數(shù)在哪里。Swift 語(yǔ)言是支持編譯型語(yǔ)言的直接派發(fā),函數(shù)表派發(fā)和消息機(jī)制派發(fā)三種派發(fā)方式的,下面分別對(duì)這三種派發(fā)方式說(shuō)明下。
    2021-06-06
  • Swift開(kāi)發(fā)之UITableView狀態(tài)切換效果

    Swift開(kāi)發(fā)之UITableView狀態(tài)切換效果

    這篇文章主要介紹了Swift開(kāi)發(fā)之UITableView狀態(tài)切換效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • 在Swift中使用KVO的細(xì)節(jié)以及內(nèi)部實(shí)現(xiàn)解析(推薦)

    在Swift中使用KVO的細(xì)節(jié)以及內(nèi)部實(shí)現(xiàn)解析(推薦)

    這篇文章主要介紹了在Swift中使用KVO的細(xì)節(jié)以及內(nèi)部實(shí)現(xiàn)解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Swift中 !和 ?的區(qū)別及使用

    Swift中 !和 ?的區(qū)別及使用

    這篇文章主要介紹了Swift中 !和 ?的區(qū)別及使用的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • swift中自定義正則表達(dá)式運(yùn)算符=~詳解

    swift中自定義正則表達(dá)式運(yùn)算符=~詳解

    這篇文章主要給大家介紹了關(guān)于swift中自定義正則表達(dá)式運(yùn)算符=~的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12

最新評(píng)論

宾阳县| 河西区| 茂名市| 宝山区| 桂林市| 招远市| 怀宁县| 馆陶县| 柯坪县| 阆中市| 宁津县| 介休市| 化隆| 衢州市| 漳州市| 南平市| 安福县| 通化县| 涿鹿县| 柳江县| 含山县| 漾濞| 象州县| 如东县| 丰宁| 云安县| 光泽县| 昂仁县| 灌南县| 象州县| 霍林郭勒市| 郁南县| 印江| 顺昌县| 河池市| 右玉县| 郑州市| 镇坪县| 万载县| 通山县| 略阳县|