在這一章節(jié)中炼列,你將學(xué)會(huì)如何在應(yīng)用中添加相機(jī)功能只搁,還會(huì)學(xué)會(huì)如何從相冊(cè)中獲取圖片和視頻,最后俭尖,將學(xué)會(huì)如何給應(yīng)用增加分享到Facebook和Twitter的功能氢惋。這一章將教會(huì)你Swift語(yǔ)言中最重要一部分,這樣你能夠更快的開發(fā)你的App稽犁。蘋果公司提供了簡(jiǎn)單快速的方法來(lái)把相機(jī)圖片和分享設(shè)計(jì)網(wǎng)絡(luò)集成到一起焰望。
UIImagePickerController
蘋果提供了一個(gè)簡(jiǎn)單的類來(lái)處理圖片和視頻。圖9-1中的UiImagePickerController看起比較眼熟已亥,被廣泛的使用在很多iOS App中熊赖。UiImagePickerController能夠讓相機(jī)中的景象直接顯示在App中,UiImagePickerController還能夠展示相冊(cè)中的圖片虑椎,讓用戶選擇圖片或者視頻秫舌。
UiImagePickerController是一個(gè)簡(jiǎn)單的界面,直接在另外的view controller(視圖控制器)中模式展示(presented modally)(presented modally是一個(gè)Segue類型)绣檬。一個(gè)modal view controller直接在當(dāng)前的view controller中顯示足陨,有點(diǎn)像是彈出框。modal view controller會(huì)從下方滑出娇未,而且只能由用戶關(guān)閉才能返回之前的界面墨缘。modal view controller只能用在臨時(shí)的交互或者短期的交互中。
Page 235
創(chuàng)建UiImagePickerController對(duì)象和創(chuàng)建其他對(duì)象一樣,首先聲明一個(gè)變量镊讼,然后調(diào)用初始化:
var imagePicker = UIImagePickerController()
Cameras(相機(jī))
在使用UiImagePickerController之前需要先檢查一下當(dāng)前設(shè)備的相機(jī)是否可用宽涌,在某些情況下,設(shè)備雖然有相機(jī)但是是不能用的蝶棋。檢查設(shè)備相機(jī)是否可用的代碼:
if UIImagePickerController.isSourceTypeAvailable(.Camera) {
//Camera is Available
} else {
//Camera not Available
}
如何相機(jī)可用卸亮,則可以設(shè)置UiImagePickerController來(lái)調(diào)用相機(jī)獲取拍攝圖片或者視頻。把UiImagePickerController設(shè)置成相機(jī)模式玩裙,需要把sourceType
屬性設(shè)置為.Camera
:
imagePicker.sourceType = .Camera
Page 236 | Chapter 9 : Camera, Photos, and Social Networks
很多iOS設(shè)備有前后兩個(gè)攝像頭兼贸。檢查前置攝像后可用還是后置攝像頭可用,我們使用isCameraDeviceAvailable
這個(gè)方法吃溅。把攝像頭的位置傳給isCameraDeviceAvailable
溶诞,然后這個(gè)方法就會(huì)返回true或者false:
if UIImagePickerController.isCameraDeviceAvailable(.Front) {
//Front Camera Available
} else {
//Front Camera Not Available
}
if UIImagePickerController.isCameraDeviceAvailable(.Rear) {
//Rear Camera Available
} else {
//Rear Camera Not Available
}
如何當(dāng)前設(shè)備沒(méi)有可用的攝像頭,UiImagePickerController可以讓用戶從相冊(cè)中選擇圖片或者視頻决侈。把sourceType
屬性設(shè)置成.PhotoLibrary
就可以展示選擇圖片界面了:
imagePicker.sourceType = .PhotoLibrary
在iOS模擬器中測(cè)試App有時(shí)候會(huì)有局限性螺垢,因?yàn)槟M器沒(méi)有攝像頭。永遠(yuǎn)不要假設(shè)設(shè)備有相機(jī)赖歌,總是檢查是否有攝像頭枉圃。為了測(cè)試攝像頭功能,你必須在真機(jī)上運(yùn)行應(yīng)用庐冯,在真機(jī)上運(yùn)行應(yīng)用的知識(shí)我們將會(huì)在第十章進(jìn)行詳細(xì)的介紹孽亲。
Media Types (媒體類型)
媒體的類型可以設(shè)置為圖片、視頻肄扎、和圖片+視頻墨林。默認(rèn)設(shè)置是圖片+視頻。想要改變這個(gè)設(shè)置犯祠,需要引入Mobile Core Services framework(Mobile Core Services框架)旭等。
首先點(diǎn)擊Project Navigator中的工程名稱,顯示工程的詳細(xì)信息衡载,然后滑到底部搔耕,找到Linked Frameworks and Libraries這部分,點(diǎn)擊左下角的加號(hào)痰娱,在搜索框中輸入MobileCoreServices弃榨,選擇MobileCoreServices.framework,點(diǎn)擊Add按鈕梨睁。
這樣MobileCoreServices.framework文件就添加到你的Project Navigator中了鲸睛,接著你需要在代碼中添加這行代碼:
import MobileCoreServices
有了這行代碼,MobileCoreServices.framework類就會(huì)添加到你代碼中坡贺,你可以使用這個(gè)框架了官辈。下面是每個(gè)媒體類型的關(guān)鍵詞:
UIImagePickerController | Page 237
kUTTypeImage
相片和圖片
kUTTypeMovie
電影和視頻
用數(shù)組來(lái)設(shè)置mediaTypes
屬性箱舞,可以存數(shù)合適的數(shù)值。例如:
imagePicker.mediaTypes = [kUTTypeImage]
//只能拍攝或選擇圖片
imagePicker.mediaTypes = [kUTTypeMovie]
//只能拍攝或選擇視頻
Editing(編輯)
蘋果甚至提供了縮放圖標(biāo)和修剪視頻的功能拳亿,叫做editing controls 晴股,把allowsEditing
屬性設(shè)置為true
就能開啟這些功能了。例如:
imagePicker.allowsEditing = true
這樣就能進(jìn)入編輯界面肺魁,你還能獲取到編輯后和編輯前的媒體电湘。
Delegates (委托)
UiImagePickerController提供了一些用戶基本交互操作的委托更新(delegate updates)(這里不確定delegate updates的翻譯是否正確)。例如當(dāng)用戶存儲(chǔ)一個(gè)新的媒體時(shí)鹅经,就觸發(fā)了一個(gè)delegate updates寂呛。為了能夠收到這些updates,我們需要把UiImagePickerController委托到當(dāng)前的view controller瞬雹,使用self關(guān)鍵詞來(lái)表示當(dāng)前的view controller昧谊。例如:
imagePicker.delegate = self
當(dāng)然刽虹,我們還要保證當(dāng)前的view controller已經(jīng)遵從了UiImagePickerController協(xié)議酗捌,遵從協(xié)議的方法很簡(jiǎn)單,就在當(dāng)前的view controller中添加這行代碼:
class ViewController: UIViewController, UIImagePickerControllerDelegate {
因?yàn)?em>UiImagePickerController繼承自UINavigationController涌哲,所以還要遵從UINavigationController協(xié)議胖缤,這份協(xié)議提供UINavigationController如push和pop等事件的updates,你的view controller必須要遵從協(xié)議阀圾,但是協(xié)議中方法(methods)都是可選的哪廓。詳見(jiàn)代碼:
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
Page 238 | Chapter 9 : Camera, Photos, and Social Networks
Working with Images
UIImagePickerControllerDelegate
有兩個(gè)方法來(lái)處理媒體,第一個(gè)方法是imagePickerController(_: didFinishPickingImage)
初烘,當(dāng)相機(jī)拍攝了一張圖片或者從相冊(cè)中選擇了一張圖片后涡真,這個(gè)方法就會(huì)觸發(fā)delegate。如果用戶是創(chuàng)建或選擇的視頻肾筐,那么這個(gè)方法不會(huì)被調(diào)用哆料。這個(gè)方法提供了UIImage參數(shù),來(lái)包括新創(chuàng)建的圖片吗铐。為了能夠出發(fā)這個(gè)事件东亦,我們需要添加下列代碼:
func imagePickerController(picker: UIImagePickerController!,didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!){
}
Working with Multiple Media Types
第二個(gè)方法更高級(jí)一些,是imagePickerController(_:, didFinishPickingMediaWithInfo _:)
唬渗,當(dāng)用戶創(chuàng)建選擇了圖片視頻典阵,這個(gè)方法會(huì)觸發(fā)委托。如果sourceType
設(shè)置為.PhotoLibrary
镊逝,那么這個(gè)方法會(huì)在用戶選中圖片或視頻后被調(diào)用壮啊;如果sourceType
設(shè)置為.Camera
,用戶拍攝了圖片或視頻并且確認(rèn)保存后撑蒜,這個(gè)方法才會(huì)被調(diào)用歹啼。info
參數(shù)值為新圖片視頻提供了額外的信息充坑。
添加下列代碼可激活這個(gè)事件:
func imagePickerController(picker:UIImagePickerController,didFinishPickingMediaWithInfo info: [NSObject : AnyObject]){
//media selected
}
info
參數(shù)還包括mediaType
變量,在獲取圖片視頻之前染突,需要先檢查mediaType
捻爷,獲取info
參數(shù)中的鍵(key)UIImagePickerControllerMediaType
就可以檢查mediaType
了:
var mediaType = info[UIImagePickerControllerMediaType]
info
字典類型參數(shù)里面包含了很多關(guān)于新拍攝或選擇圖片視頻的信息,下面這些鍵(key)將會(huì)提供所選內(nèi)容的具體值:
UIImagePickerControllerMediaType
Media type媒體類型份企,類如:kUTTypeImage 或者 kUTTypeMovie
UIImagePickerControllerOriginalImage
原始未裁剪的圖片
UIImagePickerControllerEditedImage
編輯過(guò)的圖片也榄,只有allowsEditing
設(shè)置為true
UIImagePickerController | Page 239
UIImagePickerControllerCropRect
將原始圖片矩形裁剪
UIImagePickerControllerMediaURL
視頻在本地文件中的路徑(僅限視頻)
UIImagePickerControllerReferenceURL
用于高級(jí)視頻框架的URL(URL used with advanced video framework)
UIImagePickerControllerMediaMetadata
僅限圖片,字典中圖片的元數(shù)據(jù)(Photos only, dictionary full of metadata for image)
所有的這些鍵都能獲取到媒體的更多信息司志,最常用的鍵是UIImagePickerControllerMediaType
, UIImagePickerControllerOriginalImage
, 和 UIImagePickerControllerMediaURL
甜紫。
mediaType
覆蓋后,運(yùn)行if語(yǔ)句來(lái)檢測(cè)是圖片還是視頻(這話原話是Once the mediaType has been recovered, run it through an if statement to detect if itis a video or a photo.我不知道recovered在這里應(yīng)該如何翻譯啊……)骂远。例如:
var mediaType = info[UIImagePickerControllerMediaType! as NSString]
if mediaType == kUTTypeImage as NSString {
//photo
} else if mediaType == kUTTypeMovie {
//video
} else {
//error/missing
}
Images with didFinishPickingMediaWithInfo
如果mediaType
的類型是圖片囚霸,那么圖片的會(huì)直接傳入到 info
參數(shù)中,新圖片會(huì)直接從字典中提取出來(lái)放入到UIImage激才,UIImage這個(gè)類是用來(lái)存儲(chǔ)圖片的拓型,UIImage的圖片傳給UIImageView,UIImageView就像是相片的相框瘸恼,它能把圖片裝裱起來(lái)劣挫,圖片也能隨時(shí)更換
UIImageView在用戶界面上展示UIImage的內(nèi)容。例如:
var myImage = info[UIImagePickerControllerOriginalImage] as UIImage
把圖片放入U(xiǎn)IImageView的方法:把UIImageView的image
屬性設(shè)置為UIImagePickerControllerOriginalImage的鍵:
imageView.image = myImage
Page 240 | Chapter 9 : Camera, Photos, and Social Networks
Video in didFinishPickingMediaWithInfo
如果mediaType
的類型是視頻东帅,視頻不會(huì)直接存儲(chǔ)到字典中压固,而是存儲(chǔ)視頻文件的路徑,用
UIImagePickerControllerMediaURL
鍵來(lái)獲取靠闭。獲取路徑而不是直接獲取視頻帐我,有一個(gè)非常大的好處,能夠節(jié)省電量和內(nèi)存愧膀。視頻路徑可以傳遞給MPMoviePlayerViewController拦键,在用戶屏幕上播放。獲取視頻的代碼:
var videoPath = info[UIImagePickerControllerMediaURL as NSURL
MPMoviePlayerViewController這個(gè)類能夠讓開發(fā)視頻播放的工作更簡(jiǎn)單扇调,給MPMoviePlayerViewController一個(gè)視頻路徑矿咕,就能播放視頻,也能在播放過(guò)程中做一些簡(jiǎn)單的操作狼钮。MPMoviePlayerViewController需要Media Player framework這個(gè)框架碳柱。
首先點(diǎn)擊Project Navigator中的工程名稱,顯示工程的詳細(xì)信息熬芜,然后滑到底部莲镣,找到Linked Frameworks and Libraries這部分,點(diǎn)擊左下角的加號(hào)涎拉,在搜索框中輸入MediaPlayer瑞侮,選擇MediaPlayer.framework的圆,點(diǎn)擊Add按鈕。
這樣MediaPlayer.framework文件就添加到你的Project Navigator中了半火,接著你需要打開view controller越妈,然后把鼠標(biāo)放到import UIKit下方,然后添加這行代碼:
import MediaPlayer
這行代碼會(huì)把MediaPlayer.framework類引入到當(dāng)前代碼中钮糖,MediaPlayer.framework中包括MPMoviePlayerViewController這個(gè)類梅掠。
接著,和創(chuàng)建其他的對(duì)象一樣店归,創(chuàng)建一個(gè)MPMoviePlayerViewController阎抒,接著設(shè)置它的contentUIRL
屬性:
var videoPath = info[UIImagePickerControllerMediaURL as NSURL]
var myMoviePlayerViewController = MPMoviePlayerViewController()
myMoviePlayerViewController.moviePlayer.contentURL = videoPath
Presenting UIImagePickerController
展示新的view controller,我們使用presentViewController
這個(gè)方法:
self.presentViewController(imagePicker, animated: true, completion: nil)
UIImagePickerController | Page 241
Integrating with Social Networks (加入社交網(wǎng)絡(luò)功能)
在很多手機(jī)應(yīng)用中消痛,把內(nèi)容分享到社交網(wǎng)絡(luò)上已經(jīng)成為一個(gè)核心的特性且叁,然而,把所有的社交網(wǎng)絡(luò)都整合到App中會(huì)非持壬。花費(fèi)時(shí)間逞带,蘋果公司提供了Social framwork讓開發(fā)分享功能更簡(jiǎn)單。Social framework中包括SLComposeViewController稠歉,SLComposeViewController這個(gè)類可以讓用戶把內(nèi)容分享到Twitter和Facebook掰担。SLComposeViewController使用用戶在iPhone設(shè)置中填寫的登錄帳號(hào)密碼汇陆,這就說(shuō)明開發(fā)者不必自己寫代碼就可以分享到Facebook和Twitter了怒炸,用戶可以分享文字、鏈接甚至是圖片毡代。
在使用SLComposeViewController之前阅羹,我們需要先把Social framework引入到工程當(dāng)中。首先點(diǎn)擊Project Navigator中的工程名稱教寂,顯示工程的詳細(xì)信息捏鱼,然后滑到底部,找到Linked Frameworks and Libraries這部分酪耕,點(diǎn)擊左下角的加號(hào)导梆,在搜索框中輸入Social,選擇Socail.framework迂烁,點(diǎn)擊Add按鈕看尼。這樣Social.framework文件就添加到你的Project Navigator中了,接著你需要打開view controller盟步,然后把鼠標(biāo)放到import UIKit下方藏斩,然后添加這行代碼:
import Social
Setting the Social Network (設(shè)置社交網(wǎng)絡(luò))
上面這行代碼會(huì)把Social framework引入到view controller中,使SLComposeViewController可以在代碼中使用了却盘。在創(chuàng)建SLComposeViewController時(shí)需要提供serviceType狰域,serviceType類型有兩個(gè)選項(xiàng):
SLServiceTypeFacebook
Facebook
SLServiceTypeTwitter
Twitter
首先要核實(shí)需要的service是否可用媳拴,使用isAvailableForServiceType(_: )
來(lái)檢查service類型在當(dāng)前設(shè)備是否可用:
if (SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook)) {
//Facebook available
}
我們可以使用_(forServiceType:)方法來(lái)創(chuàng)建SLComposeViewController,有一個(gè)forServiceType參數(shù):
if (SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook)) {
//Facebook available
var myComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
}
Page 242 | Chapter 9: Camera, Photos, and Social Networks
Setting the Initial Text (設(shè)置默認(rèn)文案)
你還可以給SLComposeViewController設(shè)置默認(rèn)文案兆览,這段默認(rèn)文案會(huì)出現(xiàn)分享界面屈溉,提前給用戶寫好,用戶可以直接就分享出去抬探,當(dāng)然也可以刪除或者修改文案语婴。我們用setInitialText(_:)方法來(lái)創(chuàng)建默認(rèn)文案:
var myComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
myComposeViewController.setInitialText("I love this app!")
Adding Images (增加分享圖片)
SLComposeViewController也支持圖片分享,使用addImage(_:)方法驶睦,這個(gè)方法有一個(gè)UIImage參數(shù):
myComposeViewController.addImage(myImage)
Adding URLs
如果不能分享鏈接那么分享就沒(méi)有意義了砰左,SLComposeViewController當(dāng)然支持分享URL,使用addURL(_:)方法场航,接收NSURL作為參數(shù)缠导。NSURL和字符串非常相似,專門為UIL和文件路徑使用溉痢。例如:
var myURL = NSURL(string: "http://www.google.com")
myComposeViewController.addURL(myURL)
Presenting SLComposeViewController
最后僻造,SLComposeViewController創(chuàng)建并且設(shè)置完成后,需要把SLComposeViewController呈現(xiàn)給用戶了孩饼,我們使用modally present這個(gè)呈現(xiàn)方式髓削,使用presentViewController(_:,animated: completion: )
方法,例如:
self.presentViewController(myComposeViewController,animated: true, completion: nil)
這樣SLComposeViewController就會(huì)展示在用戶面前镀娶,用戶分享內(nèi)容立膛。如果用戶還沒(méi)有登錄社交網(wǎng)絡(luò),iOS會(huì)引導(dǎo)他到設(shè)置中的登錄界面完成操作梯码。
現(xiàn)在是時(shí)候把知識(shí)應(yīng)用到實(shí)踐中去了宝泵,來(lái)創(chuàng)建一個(gè)自拍照App吧。
Integrating with Social Networks | Page 243