自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Swift編程實戰(zhàn)指南--豆瓣電臺

移動開發(fā) iOS
前段時間用Swift練手寫了這么一個demo,后來有朋友希望能出個教程,于是就搗鼓出這么一個系列教程,內(nèi)容包括準(zhǔn)備、界面布局、獲取網(wǎng)絡(luò)數(shù)據(jù)、歌曲列表的展現(xiàn)、播放音樂、視圖跳轉(zhuǎn)傳參及回跳、顯示動畫、播放進(jìn)度與時間以及簡單手勢控制暫停播放九個部分。

前段時間用Swift練手寫了這么一個demo,后來有朋友希望能出個教程,于是就搗鼓出這么一個系列教程,內(nèi)容包括準(zhǔn)備、界面布局、獲取網(wǎng)絡(luò)數(shù)據(jù)、歌曲列表的展現(xiàn)、播放音樂、視圖跳轉(zhuǎn)傳參及回跳、顯示動畫、播放進(jìn)度與時間以及簡單手勢控制暫停播放九個部分。

Swift實戰(zhàn)-豆瓣電臺(一)準(zhǔn)備

我們現(xiàn)在看看我們要做一個什么樣的東西,觀看地址:http://v.youku.com/v_show/id_XNzI4ODY2Mjky.html

布局

通過上面這張圖我們可以看出整個 demo 有兩個視圖,視圖一用來播放音樂,視圖二用來選擇頻道。

視圖一

ImageView用來顯示音樂的圖片

TableView用來顯示音樂列表

Progress用來顯示播放進(jìn)度

Label用來顯示播放時間

Button用來切換視圖

視圖二

Lbale顯示“選擇頻道”

Tableview用來顯示頻道列表

知識要點

組件:

ImageView

TableView

TableViewCell

Progress

Label

Button

MediaPlayer

知識點:

視圖之間的跳轉(zhuǎn),傳參,回跳

協(xié)議

異步獲取數(shù)據(jù)

Json解析

動畫效果

豆瓣API

頻道列表

http://www.douban.com/j/app/radio/channels

歌曲列表

http://douban.fm/j/mine/playlist?channel=0

#p#

Swift實戰(zhàn)-豆瓣電臺(二)界面布局

觀看地址:http://v.youku.com/v_show/id_XNzMwMDg4NzAw.html

這節(jié)的內(nèi)容主要是storyboard的操作。

有以下幾個知識點

1.TableView的DataSource與Delegate的設(shè)定。我們將其綁定在 ViewController 上,使之遵循 UITableViewDataSource,UITableViewDelegate 協(xié)議來實現(xiàn)。然后我們實現(xiàn)了兩個函數(shù),一個返回了 TableView 中行數(shù)。也就是 TableView 里面有多少條數(shù)據(jù)。

  1. func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int{ 
  2.         return 10 

一個返回了TableView的單元格(cell)實例,也就是單元格長什么樣

  1. func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!{ 
  2.         let cell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "douban"
  3.         return cell 

2. 單元格的識別。在 storyboard 中選中 cell。然后設(shè)置 ldentifier 的值來實現(xiàn)。ldentifier 的值與下列語句中的 reuseIdentifier 的值(”douban”)對應(yīng)。

  1. let cell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "douban"

3. 從頻道列表中返回主界面如果按照主界面跳轉(zhuǎn)到頻道列表的方式則會不斷地產(chǎn)生新的主界面。所以用 dismissViewControllerAnimated 函數(shù)來回跳

  1. self.dismissViewControllerAnimated(true, completion: nil) 

本節(jié)高清視頻及項目文件下載地址:http://pan.baidu.com/s/1sjHd5qX

#p#

Swift實戰(zhàn)-豆瓣電臺(三)獲取網(wǎng)絡(luò)數(shù)據(jù)

觀看地址:http://v.youku.com/v_show/id_XNzMwMzQxMzky.html

這節(jié)內(nèi)容,我們先說了怎么將storyboard中的組件在類中進(jìn)行綁定。然后寫了一個類用來獲取網(wǎng)絡(luò)數(shù)據(jù),同時定義了一個協(xié)議,在獲取數(shù)據(jù)后進(jìn)行回調(diào)。之后對json數(shù)據(jù)進(jìn)行解析,轉(zhuǎn)化為一個字典。

知識點

異步獲取數(shù)據(jù)

  1. var nsUrl:NSURL=NSURL(string: url) 
  2. var request:NSURLRequest=NSURLRequest(URL: nsUrl) 
  3. NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void) 

NSURL NSURLRequest 都是使用簡單卻難以簡單說明的東西。意會吧。

NSURLConnection.sendAsynchronousRequest 方法中的 NSOperationQueue.mainQueue() 將獲取數(shù)據(jù)這個任務(wù)放進(jìn)主隊列。

completionHandler:完成任務(wù)后函數(shù)調(diào)用。

Json解析

  1. var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary 

NSJSONReadingOptions.MutableContainer:設(shè)置返回的對象是可以隨時添加新值的Mutable 類型的對象

協(xié)議

協(xié)議和其他語言中的接口類似,我們在數(shù)據(jù)獲取類中設(shè)置一個遵循該協(xié)議的成員,當(dāng)數(shù)據(jù)獲取完畢后,該成員執(zhí)行某個方法來使用數(shù)據(jù)。我們?nèi)绻挥脜f(xié)議用具體的某個類也是可以的。但就失去了靈活性。

高清視頻及代碼下載地址:http://pan.baidu.com/s/1sjHd5qX

#p#

Swift實戰(zhàn)-豆瓣電臺(四)歌曲列表的展現(xiàn)

觀看地址 : http://v.youku.com/v_show/id_XNzMwNDE0OTA4.html

這節(jié)的主要內(nèi)容是如何利用 cell 展現(xiàn)獲取到的數(shù)據(jù)。

首先申明兩個數(shù)組來儲存我們獲取到的數(shù)據(jù)

  1. var tableData:NSArray=NSArray() 
  2. var channelData:NSArray=NSArray() 

 tableData 是主界面上歌曲列表要用的數(shù)據(jù)。所以在 func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) 這個方法中要返回tableData的數(shù)量

  1. func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int{ 
  2.         return tableData.count 
  3. }  

 然后我們把tableData中的數(shù)據(jù)填充到主界面的TableView中

  1. let cell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "douban"
  2. let rowData:NSDictionary=self.tableData[indexPath.row] as NSDictionary 
  3. cell.text=rowData["title"] as String 
  4. cell.detailTextLabel.text=rowData["artist"] as NSString 

接著我們在顯示縮略圖的時候先給一張默認(rèn)的圖片

  1. cell.image=UIImage(named:"detail.jpg"

然后我們?nèi)プト【W(wǎng)絡(luò)圖片,同樣,是用異步的方式。為了提高性能,我們對獲取的圖片做了一個緩存

  1. var imageCache = Dictionary<String,UIImage>() 

通過圖片的地址來緩存UIImage

  1. let url=rowData["picture"] as String 
  2. let image=self.imageCache[url] as?UIImage 
  3. if !image?{ 
  4.     let imgURL:NSURL=NSURL(string:url) 
  5.     let request:NSURLRequest=NSURLRequest(URL: imgURL) 
  6.     NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response:NSURLResponse!,data:NSData!,error:NSError!)->Void in 
  7.         var img=UIImage(data:data) 
  8.         cell.image=img 
  9.         self.imageCache[url]=img 
  10.     }) 
  11. }else
  12.     cell.image=image 
  13. }   

本節(jié)高清視頻和代碼下載地址:http://pan.baidu.com/s/1sjHd5qX

#p#

Swift實戰(zhàn)-豆瓣電臺(五)播放音樂

觀看地址:http://v.youku.com/v_show/id_XNzMwODM0MzI0.html

在這節(jié)里面,我們簡單學(xué)習(xí)了一下MediaPlayer的使用

引入媒體框架

  1. import MediaPlayer 

聲明一個媒體播放器

  1. var audioPlayer:MPMoviePlayerController=MPMoviePlayerController(); 

播放暫停操作

  1. self.audioPlayer.stop() 
  2. self.audioPlayer.contentURL=NSURL(string:url) 
  3. self.audioPlayer.play() 

 本節(jié)高清視頻及源碼下載地址:http://pan.baidu.com/s/1sjHd5qX

#p# 

Swift實戰(zhàn)-豆瓣電臺(六)視圖跳轉(zhuǎn),傳參及回跳

youku觀看地址:http://v.youku.com/v_show/id_XNzMxMzQ3MDcy.html

要點

在ChannelController里面聲明一個代理

這個代理遵循我們自定義的協(xié)議ChannlePrococol。

遵循這個協(xié)議的主界面類在注入后有一個回調(diào)方法onChangeChanne將所選擇的頻道返回。

prepareForSegue方法

這個方法是在準(zhǔn)備跳轉(zhuǎn)的時候執(zhí)行的。在這里面我們能拿到將要跳轉(zhuǎn)的視圖類segue.destinationViewController,這時候就能設(shè)置這個類的代理,并將數(shù)據(jù)傳過去了

高清視頻與代碼下載地址:http://pan.baidu.com/s/1sjHd5qX

#p#

Swift實戰(zhàn)-豆瓣電臺(七)顯示動畫

youku觀看地址:http://v.youku.com/v_show/id_XNzMxODQzNDIw.html

這是一個很酷的動畫效果。特別是數(shù)據(jù)多的時候

知識點

在單元格(Cell)顯示方法中設(shè)置動畫

  1. func tableView(tableView: UITableView!, willDisplayCell cell: UITableViewCell!, forRowAtIndexPath indexPath: NSIndexPath!){ 
  2.         cell.layer.transform = CATransform3DMakeScale(0.1, 0.1, 1) 
  3.         UIView.animateWithDuration(0.25, animations: { 
  4.             cell.layer.transform=CATransform3DMakeScale(1, 1, 1) 
  5.             }) 

willDisplayCell 顧名思義。就是在Cell顯示之前。設(shè)置cell的層(layer)的變換(transform)為CATransform3DMakeScale做一個縮放動畫。X,y方向的縮放從0.1到1

高清視頻與代碼下載地址:http://pan.baidu.com/s/1sjHd5qX

#p#

Swift實戰(zhàn)-豆瓣電臺(八)播放進(jìn)度與時間

視頻觀看地址:http://www.tudou.com/programs/view/4mEtz8S72k0/?resourceId=399000367_06_02_99

這節(jié)主要內(nèi)容是 NSTimer,UIProgressView,MPMoviePlayerController 類的使用

NSTimer

實例化:

  1. timer=NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "onUpdate", userInfo: nil, repeats: true)// 實例化后即啟動定時器,0.4秒后開始第一次觸發(fā) 

0.4 是間隔時間;target 是發(fā)送對象;selector 是觸發(fā)的方法;userInfo 此參數(shù)可以為 nil,當(dāng)定時器失效時,由你指定的對象保留和釋放該定時器;repeats 是否重復(fù)。

立即觸發(fā)

  1. fire() 

 停止

  1. invalidate() 

 UIProgressView

設(shè)置進(jìn)度條進(jìn)度

  1. progressView.progress=0.0 

 帶動畫

  1. progressView.setProgress(p, animated: true

MPMoviePlayerController

audioPlayer.currentPlaybackTime 已經(jīng)播放的時間(秒)

audioPlayer.duration 總時間(秒)

秒鐘分鐘算法

總時間除以60的余數(shù)就是秒鐘

總時間除以60的商就是分鐘

因為我們的展現(xiàn)形式是00:00

所以當(dāng)數(shù)字小于10的時候進(jìn)行字符串拼接補0例如01,02

本節(jié)高清視頻和代碼下載地址:http://pan.baidu.com/s/1sjHd5qX

#p# 

Swift實戰(zhàn)-豆瓣電臺(九)簡單手勢控制暫停播放

全屏清晰觀看地址:http://www.tudou.com/programs/view/tANnovvxR8U/

這節(jié)我們主要講 UITapGestureRecognizerMPMoviePlayerController

知識點

UITapGestureRecognizer

關(guān)聯(lián)storyboard上的UITapGestureRecognizer

  1. @IBOutlet var tap:UITapGestureRecognizer=nil  //注意要設(shè)置為nil 

增加手勢識別

  1. addGestureRecognizer(tap) 

移除手勢識別

  1. removeGestureRecognizer(tap) 

關(guān)聯(lián)Action

  1. @IBAction func onTap(recognizer: UITapGestureRecognizer) 

通過 recognizer.view 可以判斷點擊了哪個組件

  1. @IBAction func onTap(recognizer: UITapGestureRecognizer){ 
  2.         if recognizer.view==btnPlay { 
  3.             btnPlay.hidden=true 
  4.             audioPlayer.play() 
  5.             btnPlay.removeGestureRecognizer(tap) 
  6.             iv.addGestureRecognizer(tap) 
  7.         }else if recognizer.view==iv { 
  8.             btnPlay.hidden=false 
  9.             audioPlayer.pause() 
  10.             btnPlay.addGestureRecognizer(tap) 
  11.             iv.removeGestureRecognizer(tap) 
  12.         } 

MPMoviePlayerController

播放

  1. play() 

暫停

  1. pause() 

本節(jié)高清視頻和代碼下載地址:http://pan.baidu.com/s/1sjHd5qX

原帖地址:http://www.cnblogs.com/sandal1980/p/3812715.html  作者:sandal1980(博客

責(zé)任編輯:black.dot 來源: cnblogs
相關(guān)推薦

2013-06-17 14:10:08

WP7開發(fā)Windows Pho豆瓣電臺

2011-09-23 09:24:26

豆瓣電臺應(yīng)用

2025-03-21 09:01:34

Swift任務(wù)取消機制協(xié)作式取消

2014-06-06 09:13:28

SwiftSwift編程

2024-08-13 08:27:24

PythonTCP協(xié)議網(wǎng)絡(luò)編程

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala

2016-11-04 21:37:16

PythonSocket

2010-07-20 13:32:25

Perl編程格式

2011-12-12 11:16:02

iOS并發(fā)編程

2017-01-12 14:55:50

JavaScript編程

2011-07-03 10:16:45

Core Animat

2023-10-23 14:16:01

Java函數(shù)式編程

2025-03-06 11:07:27

2021-08-30 07:49:32

NacosSync雙向復(fù)制

2014-06-06 14:25:03

iOS 8SwiftWWDC2014

2011-12-13 15:15:14

360開放平臺

2023-01-18 23:20:25

編程開發(fā)

2015-09-22 10:04:38

GoogleJava編程

2014-06-03 10:44:20

Swift開發(fā)語言

2017-02-13 13:14:07

點贊
收藏

51CTO技術(shù)棧公眾號