Day 3 - 播放本地視頻嫩海,閉包,代理

先看效果圖

最終效果

Day 2用的是拖線囚痴,這里使用純代碼完成

<br />

1叁怪、創(chuàng)建工程、搭建UI

創(chuàng)建工程不說了深滚!
直接搭建UI
分析UI奕谭,一個tableView,自定的Cell

1.1創(chuàng)建tableView

var tableView = UITableView()
或者
var tableview :UITableView? = UITableView()

1.2創(chuàng)建Cell

選擇Swift

下一步痴荐,名字隨便你

觀察可得知Cell至少包含

UIImageView血柳,UIbutton ,UIlabel(兩個)

所以在你的Swift中申明一下變量

    var icon: UIImageView?
    var titleLabel : UILabel?
    var deTitleLabel: UILabel?
    var playBtn : UIButton?

1.3 創(chuàng)建icon生兆、titleLabel难捌,deTitleLabel、playBtn

在init init(style: UITableViewCellStyle, reuseIdentifier: String?)方法中創(chuàng)建
在layoutSubViews中布局

override func layoutSubviews() {
        super.layoutSubviews()
        
        icon?.frame = self.contentView.bounds
        playBtn?.bounds = CGRectMake(0, 0, 50, 50)
        playBtn?.frame.origin = CGPointMake((self.contentView.bounds.size.width - 50) / 2, (self.contentView.bounds.size.height - 50) / 2)
        playBtn?.setImage(UIImage.init(named: "playBtn"), forState: UIControlState.Normal)
        
        titleLabel?.frame = CGRectMake(0, self.contentView.bounds.size.width * 0.5 - 10, self.contentView.bounds.size.width, 20);
        deTitleLabel?.frame = CGRectMake(0, self.contentView.bounds.size.width * 0.5 + 20, self.contentView.bounds.size.width, 20);
     
    }
    
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        playBtn = UIButton.init(type: UIButtonType.Custom)
        playBtn?.addTarget(self, action: #selector(TableViewCell.click(_:)), forControlEvents: UIControlEvents.TouchUpInside);
        
        icon = UIImageView.init()
        titleLabel = UILabel.init();
        titleLabel?.textAlignment = NSTextAlignment.Center
        titleLabel?.textColor = UIColor.whiteColor()
        deTitleLabel = UILabel.init();
        deTitleLabel?.textAlignment = NSTextAlignment.Center
        deTitleLabel?.textColor = UIColor.whiteColor()
        self.contentView.addSubview(icon!)
        self.contentView.addSubview(playBtn!)
        self.contentView.addSubview(titleLabel!)
        self.contentView.addSubview(deTitleLabel!)
    }

上面的代碼基本上就是設(shè)置大小皂贩,位置

textAlignment:文字對齊方式
textColor:文字顏色
addSubView()添加到View中
addTarget:添加事件
frame大小位置
bounds:大小 x y 一般寫0
init()初始化

實(shí)現(xiàn)按鈕點(diǎn)擊方法:不然會報(bào)錯

func click(button:UIButton){
        print("click me");
}

1.4栖榨、創(chuàng)建TableView昆汹,添加到View中明刷,設(shè)置代理,實(shí)現(xiàn)代理满粗,創(chuàng)建數(shù)據(jù)源辈末,提前注冊Cell,

與下面代碼一一對應(yīng)

    tableView = UITableView.init(frame: self.view.bounds, style: UITableViewStyle.Plain)
        tableView.delegate = self;
        tableView.dataSource = self;
        self.view.addSubview(tableView);
        
        tableView.registerClass(TableViewCell.self, forCellReuseIdentifier: "Cell")

導(dǎo)入代理:

class ViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate 

實(shí)現(xiàn)代理方法

 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell
        cell.delegate = self
        
        return cell;
    }

2、設(shè)置數(shù)據(jù)源

在1中完成了自定義Cell映皆,使用代碼創(chuàng)建TableView挤聘,但是運(yùn)行并沒有數(shù)據(jù)
接下來就是為Cell設(shè)置數(shù)據(jù)源
在Cell中添加一個方法

 func initData(imageNamed : NSString , title : NSString , deTitle : NSString){
        icon?.image = UIImage.init(named: imageNamed as String)
        titleLabel?.text = String(title)
        deTitleLabel?.text = deTitle as String
    }

這里我們需要圖片名稱、標(biāo)題捅彻、時間
所以我們創(chuàng)建一個結(jié)構(gòu)體在Swift中

struct video {
    let imageNamed: String
    let title: String
    let time:String
    
}

在把數(shù)據(jù)源添加好:

var data : Array = [video(imageNamed: "videoScreenshot01", title: "Introduce 3DS Mario", time: "Youtube - 06:32"),
                        video(imageNamed: "videoScreenshot02", title: "Emoji Among Us", time: "Vimeo - 3:34"),
                        video(imageNamed: "videoScreenshot03", title: "Seals Documentary", time: "Vine - 00:06"),
                        video(imageNamed: "videoScreenshot04", title: "Adventure Time", time: "Youtube - 02:39"),
                        video(imageNamed: "videoScreenshot05", title: "Facebook HQ", time: "Facebook - 10:20"),
                        video(imageNamed: "videoScreenshot06", title: "Lijiang Lugu Lake", time: "Allen - 20:30")]

然后對tableVIew的方法進(jìn)行修改

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell
        cell.delegate = self
        let model = self.data[indexPath.row];
        
        cell.initData(model.imageNamed, title: model.title, deTitle: model.time)

到這里為止:我們完成了展示组去,可是我們點(diǎn)擊并不能播放,所以實(shí)現(xiàn)最后一步:
回調(diào)

4步淹、回調(diào)

  • 4.1 閉包:

4.1.1 申明一個閉包:

typealias buttonClickFunc = (button:UIButton)->Void

4.1.2 申明一個變量

var myBtnClickBlock = buttonClickFunc?()

4.1.3 添加一個方法

func myPlayBtnClickBlock(block:(button:UIButton)->Void){
        myBtnClickBlock = block
    }

4.1.4 在按鈕點(diǎn)擊事件中調(diào)用

func click(button:UIButton){
        print("click me");
        
        //如果block不存在就不調(diào)用
        if (myBtnClickBlock != nil) {
            myBtnClickBlock!(button: button)
        }
    }

4.1.5 在ViewController中修改方法

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell
        cell.delegate = self
        let model = self.data[indexPath.row];
        
        cell.initData(model.imageNamed, title: model.title, deTitle: model.time)
       
        cell.myPlayBtnClickBlock { (button) in
            print("我是VC")
        }
        return cell;
    }

到這里你就會發(fā)現(xiàn)能打印“我是VC”从隆,這行了诚撵,然后我們就可以開始播放視頻了,

  • 播放視頻之前要把視頻導(dǎo)入到項(xiàng)目工程中键闺,項(xiàng)目最后會把資源上傳

寫一個方法專門用來播放視頻
先導(dǎo)入必要框架

import AVKit
import AVFoundation

申明對象:

var playViewController = AVPlayerViewController()
var playerView = AVPlayer()

播放視頻的實(shí)現(xiàn)

func playVideo(){
                
        let path = NSBundle.mainBundle().pathForResource("emoji zone", ofType: "mp4")
        
        self.playerView = AVPlayer(URL: NSURL(fileURLWithPath: path!))
        
        self.playViewController.player = self.playerView
        
        self.presentViewController(self.playViewController, animated: true) {
            self.playViewController.player?.play()
        }
    }
path :加載視頻路徑
..下面的就是創(chuàng)建播放對象寿烟,然后present到一個頁面,進(jìn)行播放...
  • 4.2使用代理

申明代理:

protocol myBtnClickCellDelegate : class {
    func cellPlayBtnClick(cell : TableViewCell, button : UIButton)
}
這里需要注意:創(chuàng)建一個weak的變量
weak var delegate : myBtnClickCellDelegate?

在Viewcontroller中導(dǎo)入代理

class ViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate ,myBtnClickCellDelegate

實(shí)現(xiàn)代理方法:你不實(shí)現(xiàn)會報(bào)錯的辛燥,啊哈哈哈??

func cellPlayBtnClick(cell: TableViewCell, button: UIButton) {
        print("進(jìn)入代理了I肝洹!挎塌!")
        playVideo()
    }

在點(diǎn)擊按鈕的時候調(diào)用代理

func click(button:UIButton){
        print("click me");
        delegate?.cellPlayBtnClick(self, button: button)

    }

然后就可以實(shí)現(xiàn)了E橇!勃蜘!
最后把

Demo奉上

百度云

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硕噩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缭贡,更是在濱河造成了極大的恐慌炉擅,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阳惹,死亡現(xiàn)場離奇詭異谍失,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)莹汤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門快鱼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纲岭,你說我怎么就攤上這事≈钩保” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵袄琳,是天一觀的道長。 經(jīng)常有香客問我燃乍,道長唆樊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任逗旁,我火速辦了婚禮舆瘪,結(jié)果婚禮上片效,老公的妹妹穿的比我還像新娘仓洼。我一直安慰自己,他們只是感情好堤舒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著箕戳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陵吸。 梳的紋絲不亂的頭發(fā)上介牙,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音环础,去河邊找鬼。 笑死饶唤,一個胖子當(dāng)著我的面吹牛贯钩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播角雷,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勺三!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揭措,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤刻蚯,失蹤者是張志新(化名)和其女友劉穎桑嘶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逃顶,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年伴找,在試婚紗的時候發(fā)現(xiàn)自己被綠了废菱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡殊轴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出樊零,到底是詐尸還是另有隱情孽文,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布塑悼,位于F島的核電站楷掉,受9級特大地震影響厢蒜,放射性物質(zhì)發(fā)生泄漏烹植。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一巷屿、第九天 我趴在偏房一處隱蔽的房頂上張望墩虹。 院中可真熱鬧,春花似錦诫钓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绪杏。三九已至纽绍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拌夏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工霹抛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卷谈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓世蔗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顶滩。 傳聞我的和親對象是個殘疾皇子寸爆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫赁豆、插件仅醇、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 2017.02.22 可以練習(xí)析二,每當(dāng)這個時候,腦袋就犯困叶摄,我這腦袋真是神奇呀安拟,一說讓你做事情,你就犯困去扣,你可不要太...
    Carden閱讀 1,337評論 0 1
  • 童童寶貝: 媽媽把積累幾十年的美容養(yǎng)生心得整理出來與你分享,簡單的21條方法唆铐,雖然你現(xiàn)在還小奔滑,但長大以后會用到。一...
    童童愛美麗閱讀 25,754評論 110 1,095
  • 很喜歡七夕這個節(jié)日的名字氓辣,相比西方情人節(jié)來說袱蚓,我真的挺喜歡七夕這個中國情人節(jié)。簡簡單單的七夕兩個字形喇潘,蘊(yùn)藏著言之不...
    綠琺梧閱讀 421評論 0 1
  • 到了談情說愛的年紀(jì) 你總是做著與年紀(jì)不符的事 這需要怎樣解釋 你是特立獨(dú)行 還是不入世事 其實(shí)不一定非要個理由 因...
    風(fēng)上水上之聲閱讀 274評論 0 0