僅僅一個UIImageView就可以實現(xiàn)無限輪播圖效果

效果圖

首先感謝右側(cè)鏈接代碼中的圖片素材??~大神使用UICollectionView實現(xiàn)的輪播圖

據(jù)說此三方好多好多人用強大的第三方框架SDCycleScrollView

輪播圖的實現(xiàn)方式

  1. 使用UIScrollView通過contentSize設(shè)置UIImageView的展示預處理
  2. 使用UICollectionView通過設(shè)置item
  3. 使用UISwipeGestureRecognizeror或者TouchesBegan等方法

網(wǎng)絡(luò)上大部分是使用UIScrollView配合三個或者兩個UIImageView來實現(xiàn)的輪播圖治宣,就再想可不可以使用一個UIImgeView實現(xiàn)急侥,從而第三種實現(xiàn)方式也就誕生了砌滞,雖然不是特別實用,但是也算是一種簡單思維


UISwipeGestureRecognizeror(清掃手勢)邏輯

  1. 通過UIImageView添加向左向右的輕掃手勢
  2. 當觸發(fā)輕掃手勢的響應事件時坏怪,重新設(shè)置Index
  3. 使用CATransition的Type(Push)和SubType(Left/Right)來進行實現(xiàn)對應的向左向右的轉(zhuǎn)場動畫
  4. 更改完Index時贝润,在CATransition動畫中從img數(shù)組中取出對應圖片并賦值給UIImageView
  5. 賦值圖片的同時更改pageControl的currentPage來實現(xiàn)輪播圖的精仿

TouchesBegan等方法的邏輯

  1. 寫一個UIImageView的子類,并在其中實現(xiàn)Began铝宵、Move打掘、End方法
  2. 和使用UIBezierPath繪制畫板同理,首先在Touch等方法中獲取對應的點
  3. 根據(jù)點的位置改變來判斷向左滑還是向右滑
  4. 使用CATransition的Type(Push)和SubType(Left/Right)來進行實現(xiàn)對應的向左向右的轉(zhuǎn)場動畫
  5. 更改完Index時鹏秋,在CATransition動畫中從img數(shù)組中取出對應圖片并賦值給UIImageView
  6. 賦值圖片的同時更改pageControl的currentPage來實現(xiàn)輪播圖的精仿

主要以UISwipeGestureRecognizeror為例子??

UISwipeGestureRecognizeror(清掃手勢)相關(guān)代碼

一些懶加載尊蚁,注釋已經(jīng)標明清楚

var selectedIndex = 0//當前圖片

lazy var imageView: UIImageView = {//展示image
    let imageview = UIImageView()
    imageview.image = UIImage(named: "\(self.selectedIndex)")
    return imageview
}()

lazy var swipeRight: UISwipeGestureRecognizer = {//從左往右滑手勢
    let swipe = UISwipeGestureRecognizer(target: self, action: #selector(tapRightAction))
    swipe.direction = .right

    return swipe
}()

lazy var swipeLeft: UISwipeGestureRecognizer = {//從右往左滑手勢
    let swipe = UISwipeGestureRecognizer(target: self, action: #selector(tapLeftAction))
    
    swipe.direction = .left
    return swipe
}()

lazy var page: UIPageControl = {
    
    let page = UIPageControl()
    
    page.numberOfPages = self.dataList.count
    
    page.currentPage = self.selectedIndex
    
    page.pageIndicatorTintColor = UIColor.green
    
    page.currentPageIndicatorTintColor = UIColor.red
    
    return page
}()

lazy var dataList: Array<String> = {//image數(shù)據(jù)源
    
    var arr: Array<String> = []
    
    for i in 0...10 {
        arr.append("\(i)")
    }
    
    return arr
}()

viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    
    imageView.frame = CGRect(x: 0, y: 0, width: screen_width, height: screen_height)

    //重要!B乱摹:崤蟆!0偻亍G俣А! 給imageView添加手勢需要將isUserInteractionEnabled設(shè)置為true
    imageView.isUserInteractionEnabled = true
    
    //添加向左手勢
    imageView.addGestureRecognizer(swipeLeft)

    //添加向右手勢
    imageView.addGestureRecognizer(swipeRight)
    
    //獲取page的size
    let pageSize = page.size(forNumberOfPages: dataList.count)
    
    page.frame = CGRect(x: 0, y: imageView.frame.maxY - pageSize.height, width: pageSize.width, height: pageSize.height)
    
    page.center.x = imageView.frame.width / 2
    
    view.addSubview(imageView)
    
    view.addSubview(page)
    
}

從左往右滑動的響應事件

func tapRightAction() {//從左往右滑動
    
    //使用CA轉(zhuǎn)場動畫來改變方式
    
    let transition = CATransition()
    
    transition.type = kCATransitionPush
    
    transition.subtype = kCATransitionFromLeft

    //這句話也就是最重要的衙传,根據(jù)selectedIndex的值來確定是否已經(jīng)到最左側(cè)决帖,如果到最左側(cè),將selectedIndex重置為10
    selectedIndex = selectedIndex <= 0 ? 10 : selectedIndex - 1
    
    page.currentPage = selectedIndex
    
    imageView.image = UIImage(named: "\(dataList[selectedIndex])")
    
    imageView.layer.add(transition, forKey: "right")
    
}

從右往左滑動的響應事件

func tapRightAction() {//從左往右滑動

    //使用CA轉(zhuǎn)場動畫來改變方式
    
    let transition = CATransition()
    
    transition.type = kCATransitionPush
    
    transition.subtype = kCATransitionFromRight
            
    //這句話也就是最重要的粪牲,根據(jù)selectedIndex的值來確定是否已經(jīng)到最左側(cè)古瓤,如果到最右側(cè),將selectedIndex重置為0
    selectedIndex = selectedIndex >= 10 ? 0 : selectedIndex + 1
    
    page.currentPage = selectedIndex
    
    imageView.image = UIImage(named: "\(dataList[selectedIndex])")
    
    imageView.layer.add(transition, forKey: "left")
            
}

Touches基本同理腺阳,再此不一一贅述了


總結(jié)

  1. 使用UISwipeGestureRecognizer無需考慮UIImageView的復用問題落君,因為只有一個imaegView
  2. 輪播圖分為手動和自動,本文為手動控制沒有加timer亭引,如果改為自動绎速,只需要在在定時調(diào)用方法即可
  3. 使用UISwipeGestureRecognizer實現(xiàn),手指滑動一點點焙蚓,再劃回來纹冤,這個暫時沒有好的解決方式,但是可以使用Touches的相關(guān)方法解決购公,因為手指離開才回去調(diào)用End方法

小尾巴~~~

為什么很多人不用這種方法萌京,坐等各位大神回復,個人覺得沒有什么問題宏浩,完全可以精仿

demo地址
github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末知残,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子比庄,更是在濱河造成了極大的恐慌求妹,老刑警劉巖乏盐,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異制恍,居然都是意外死亡父能,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門净神,熙熙樓的掌柜王于貴愁眉苦臉地迎上來何吝,“玉大人,你說我怎么就攤上這事强挫〔戆裕” “怎么了薛躬?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵俯渤,是天一觀的道長。 經(jīng)常有香客問我型宝,道長八匠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任趴酣,我火速辦了婚禮梨树,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岖寞。我一直安慰自己抡四,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布仗谆。 她就那樣靜靜地躺著指巡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隶垮。 梳的紋絲不亂的頭發(fā)上藻雪,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音狸吞,去河邊找鬼勉耀。 笑死,一個胖子當著我的面吹牛蹋偏,可吹牛的內(nèi)容都是我干的便斥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼威始,長吁一口氣:“原來是場噩夢啊……” “哼枢纠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起字逗,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤京郑,失蹤者是張志新(化名)和其女友劉穎宅广,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體些举,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡跟狱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了户魏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驶臊。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叼丑,靈堂內(nèi)的尸體忽然破棺而出关翎,到底是詐尸還是另有隱情,我是刑警寧澤鸠信,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布纵寝,位于F島的核電站,受9級特大地震影響星立,放射性物質(zhì)發(fā)生泄漏爽茴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一绰垂、第九天 我趴在偏房一處隱蔽的房頂上張望室奏。 院中可真熱鬧,春花似錦劲装、人聲如沸胧沫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绒怨。三九已至,卻和暖如春纺酸,著一層夾襖步出監(jiān)牢的瞬間窖逗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工餐蔬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碎紊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓樊诺,卻偏偏與公主長得像仗考,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子词爬,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容