59 - Swift 之圖片瀏覽器

一 橡卤、 前言

圖像瀏覽器功能是提供給用戶查看應(yīng)有的信息圖像,不重復(fù)的循環(huán)查看。像這種功能常見(jiàn)于 App 的首頁(yè)輪播圖 啸盏、商品圖片的查看等嚣镜。

二 狈邑、圖片瀏覽器包含的知識(shí)點(diǎn)

  • 輕掃手勢(shì)(UISwipeGestureRecognizer)的創(chuàng)建碗啄、添加扒吁,使用。

  • 閉包作為參數(shù)回調(diào)的實(shí)現(xiàn)隶垮。

  • 動(dòng)畫(huà)的添加 (CATransition)

  • (UIAlertController) 如何在一個(gè) View 類中顯示秘噪。

  • 數(shù)組的循環(huán)遍歷

  • 數(shù)的取絕對(duì)值和余數(shù)

三 狸吞、圖片瀏覽器的關(guān)鍵代碼分析

1> 重寫(xiě)圖片瀏覽器的(init(frame: CGRect))方法

// 重寫(xiě)對(duì)象的方法

override init(frame: CGRect) {
    super.init(frame: frame)
    // 打開(kāi)圖像的交互
    self.isUserInteractionEnabled = true
    // 添加圖像滑動(dòng)手勢(shì)
    let leftSwipeGestureRecognizer = UISwipeGestureRecognizer.init(target: self, action: #selector(swipeMethod(_ :)))
    leftSwipeGestureRecognizer.direction = .left
    self.addGestureRecognizer(leftSwipeGestureRecognizer)
    
    let rightSwipeGestureRecognizer = UISwipeGestureRecognizer.init(target: self, action: #selector(swipeMethod(_ :)))
    rightSwipeGestureRecognizer.direction = .right
    self.addGestureRecognizer(rightSwipeGestureRecognizer)
    
    // 添加點(diǎn)擊手勢(shì)
    let tapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: #selector(tapGestureMethod(_ :)))
    self.addGestureRecognizer(tapGestureRecognizer)
    
    // 初始化對(duì)象
    self.image = UIImage.init(named: "0.jpg")
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

2> 圖片瀏覽器對(duì)象上輕掃手勢(shì)的實(shí)現(xiàn)

// TODO : 向左或向右輕掃手勢(shì)事件
func swipeMethod(_ swipeGestureRecognizer:UISwipeGestureRecognizer) -> Void {
    var isdirection =  true
    // 判斷手勢(shì)的方向
    if swipeGestureRecognizer.direction == .left {
        selecdIndex += 1
        isdirection = true
    }else if swipeGestureRecognizer.direction == .right {
        selecdIndex -= 1
        isdirection = false
    }
    self.transitionsAnimation(layer: self.layer, isDirection: isdirection)
}

3> 圖片瀏覽器的對(duì)象轉(zhuǎn)場(chǎng)動(dòng)畫(huà)

// MARK : 圖像滑動(dòng)的轉(zhuǎn)場(chǎng)
func transitionsAnimation(layer:CALayer , isDirection: Bool) -> Void {
    let transition = CATransition.init()
    // 設(shè)置動(dòng)畫(huà)開(kāi)始的進(jìn)度
    transition.startProgress = 0.0
    // 設(shè)置動(dòng)畫(huà)結(jié)束的進(jìn)度
    transition.endProgress = 1.0
    // 設(shè)置動(dòng)畫(huà)進(jìn)行的時(shí)間
    transition.duration = 0.25
    // 動(dòng)畫(huà)的類型
    transition.type = "push"
    // 動(dòng)畫(huà)的方向
    transition.subtype = isDirection == true ? kCATransitionFromRight:kCATransitionFromLeft
    // 添加圖像
    self.image = (self.imgaeArray[abs(selecdIndex)%self.imgaeArray.count] as! UIImage)
    indexCBFun(abs(selecdIndex)%self.imgaeArray.count)
    // 添加動(dòng)畫(huà)
    layer.add(transition, forKey: "NetWork小賤")
}

4> 圖像的點(diǎn)擊事件的實(shí)現(xiàn)方法

// TODO : 圖像點(diǎn)擊的事件
func tapGestureMethod(_ tapGestureRecognizer:UITapGestureRecognizer) -> Void {
    let AlertView = UIAlertController.init(title: "溫馨提示", message: String.init(format: "您選擇第%d個(gè)美女", (abs(selecdIndex)%self.imgaeArray.count)+1), preferredStyle: .alert)
    let AlertAction = UIAlertAction.init(title: "確定", style: .cancel, handler: nil)
    AlertView.addAction(AlertAction)
    UIApplication.shared.keyWindow?.rootViewController?.present(AlertView, animated: true, completion: nil)
    
}

5> 對(duì)象的使用方法

// 創(chuàng)建數(shù)據(jù)
let imgaeArrays = NSMutableArray.init(capacity: 0)
for i in 0..<6 {
    let image = UIImage.init(named: String.init(format: "%d.jpg", i))
    imgaeArrays.add(image!)
}
let sf = ShufflingFigure.init(frame: self.view.frame)
sf.imgaeArray = imgaeArrays as Array
sf.indexCBFun = { (index) in
    if self.numberLable != nil {
        self.numberLable.text = String.init(format: "%d/6", index+1)
    }
}
self.view.addSubview(sf)

四 、圖片瀏覽器的效果

Untitled.gif

五、完整代碼

1> 輪播圖對(duì)象的實(shí)現(xiàn)

//
//  ShufflingFigure.swift
//  輪播圖
//
//  Created by MAC on 2017/8/7.
//  Copyright ? 2017年 NetworkCode小賤. All rights reserved.
//

import UIKit

// block 回調(diào)


class ShufflingFigure: UIImageView {
    // 存儲(chǔ)圖像的數(shù)組
    var imgaeArray = Array<Any>.init()
    var selecdIndex = 0
    typealias callBackFunc = (_ indexV:Int)->()
    var indexCBFun : callBackFunc!
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        // 打開(kāi)圖像的交互
        self.isUserInteractionEnabled = true
        // 添加圖像滑動(dòng)手勢(shì)
        let leftSwipeGestureRecognizer = UISwipeGestureRecognizer.init(target: self, action: #selector(swipeMethod(_ :)))
        leftSwipeGestureRecognizer.direction = .left
        self.addGestureRecognizer(leftSwipeGestureRecognizer)
        
        let rightSwipeGestureRecognizer = UISwipeGestureRecognizer.init(target: self, action: #selector(swipeMethod(_ :)))
        rightSwipeGestureRecognizer.direction = .right
        self.addGestureRecognizer(rightSwipeGestureRecognizer)
        
        // 添加點(diǎn)擊手勢(shì)
        let tapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: #selector(tapGestureMethod(_ :)))
        self.addGestureRecognizer(tapGestureRecognizer)
        
        // 初始化對(duì)象
        self.image = UIImage.init(named: "0.jpg")
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    
    // TODO : 向左或向右輕掃手勢(shì)事件
    func swipeMethod(_ swipeGestureRecognizer:UISwipeGestureRecognizer) -> Void {
        var isdirection =  true
        // 判斷手勢(shì)的方向
        if swipeGestureRecognizer.direction == .left {
            selecdIndex += 1
            isdirection = true
        }else if swipeGestureRecognizer.direction == .right {
            selecdIndex -= 1
            isdirection = false
        }
        self.transitionsAnimation(layer: self.layer, isDirection: isdirection)
    }
    
    
    // TODO : 圖像點(diǎn)擊的事件
    func tapGestureMethod(_ tapGestureRecognizer:UITapGestureRecognizer) -> Void {
        let AlertView = UIAlertController.init(title: "溫馨提示", message: String.init(format: "您選擇第%d個(gè)美女", (abs(selecdIndex)%self.imgaeArray.count)+1), preferredStyle: .alert)
        let AlertAction = UIAlertAction.init(title: "確定", style: .cancel, handler: nil)
        AlertView.addAction(AlertAction)
        UIApplication.shared.keyWindow?.rootViewController?.present(AlertView, animated: true, completion: nil)
        
    }
    
    // MARK : 圖像滑動(dòng)的轉(zhuǎn)場(chǎng)
    func transitionsAnimation(layer:CALayer , isDirection: Bool) -> Void {
        let transition = CATransition.init()
        // 設(shè)置動(dòng)畫(huà)開(kāi)始的進(jìn)度
        transition.startProgress = 0.0
        // 設(shè)置動(dòng)畫(huà)結(jié)束的進(jìn)度
        transition.endProgress = 1.0
        // 設(shè)置動(dòng)畫(huà)進(jìn)行的時(shí)間
        transition.duration = 0.25
        // 動(dòng)畫(huà)的類型
        transition.type = "push"
        // 動(dòng)畫(huà)的方向
        transition.subtype = isDirection == true ? kCATransitionFromRight:kCATransitionFromLeft
        // 添加圖像
        self.image = (self.imgaeArray[abs(selecdIndex)%self.imgaeArray.count] as! UIImage)
        indexCBFun(abs(selecdIndex)%self.imgaeArray.count)
        // 添加動(dòng)畫(huà)
        layer.add(transition, forKey: "NetWork小賤")
    }
    
    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    */

}

2> 調(diào)用完整代碼

//
//  ViewController.swift
//  輪播圖
//
//  Created by MAC on 2017/8/7.
//  Copyright ? 2017年 NetworkCode小賤. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    var numberLable :UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        // 創(chuàng)建數(shù)據(jù)
        let imgaeArrays = NSMutableArray.init(capacity: 0)
        for i in 0..<6 {
            let image = UIImage.init(named: String.init(format: "%d.jpg", i))
            imgaeArrays.add(image!)
        }
        let sf = ShufflingFigure.init(frame: self.view.frame)
        sf.imgaeArray = imgaeArrays as Array
        sf.indexCBFun = { (index) in
            if self.numberLable != nil {
                self.numberLable.text = String.init(format: "%d/6", index+1)
            }
        }
        self.view.addSubview(sf)
        self.createLable()
        
    }
    
    func createLable() -> Void {
        if self.numberLable == nil {
            self.numberLable = UILabel.init(frame: CGRect.init(x: self.view.frame.width - 80, y: 30, width: 60, height: 30))
            self.numberLable.textAlignment = .center
            self.numberLable.font = UIFont.systemFont(ofSize: 20)
            self.numberLable.text = String.init(format: "%d/%d", 0+1,6)
            self.numberLable.textColor = UIColor.white
            self.numberLable.backgroundColor = UIColor.magenta
            self.numberLable.layer.masksToBounds = true
            self.numberLable.layer.cornerRadius = 6
            self.view.addSubview(self.numberLable)
        }
    }
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹋偏,一起剝皮案震驚了整個(gè)濱河市便斥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌威始,老刑警劉巖枢纠,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異黎棠,居然都是意外死亡晋渺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)脓斩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)木西,“玉大人,你說(shuō)我怎么就攤上這事随静“饲В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵燎猛,是天一觀的道長(zhǎng)恋捆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)重绷,這世上最難降的妖魔是什么沸停? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮论寨,結(jié)果婚禮上星立,老公的妹妹穿的比我還像新娘。我一直安慰自己葬凳,他們只是感情好绰垂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著火焰,像睡著了一般劲装。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昌简,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天占业,我揣著相機(jī)與錄音,去河邊找鬼纯赎。 笑死谦疾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的犬金。 我是一名探鬼主播念恍,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼六剥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了峰伙?” 一聲冷哼從身側(cè)響起疗疟,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞳氓,沒(méi)想到半個(gè)月后策彤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匣摘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年店诗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恋沃。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡必搞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出囊咏,到底是詐尸還是另有隱情恕洲,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布梅割,位于F島的核電站霜第,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏户辞。R本人自食惡果不足惜泌类,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望底燎。 院中可真熱鬧刃榨,春花似錦、人聲如沸双仍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)朱沃。三九已至苞轿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逗物,已是汗流浹背搬卒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翎卓,地道東北人契邀。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像失暴,于是被迫代替她去往敵國(guó)和親蹂安。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椭迎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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