在這一章節(jié)中,你將學(xué)會如何在應(yīng)用中添加相機功能,還會學(xué)會如何從相冊中獲取圖片和視頻,最后,將學(xué)會如何給應(yīng)用增加分享到Facebook和Twitter的功能。這一章將教會你Swift語言中最重要一部分,這樣你能夠更快的開發(fā)你的App。蘋果公司提供了簡單快速的方法來把相機圖片和分享設(shè)計網(wǎng)絡(luò)集成到一起。
UIImagePickerController
蘋果提供了一個簡單的類來處理圖片和視頻。圖9-1中的UiImagePickerController看起比較眼熟,被廣泛的使用在很多iOS App中。UiImagePickerController能夠讓相機中的景象直接顯示在App中,UiImagePickerController還能夠展示相冊中的圖片,讓用戶選擇圖片或者視頻。
UiImagePickerController是一個簡單的界面,直接在另外的view controller(視圖控制器)中模式展示(presented modally)(presented modally是一個Segue類型)。一個modal view controller直接在當(dāng)前的view controller中顯示,有點像是彈出框。modal view controller會從下方滑出,而且只能由用戶關(guān)閉才能返回之前的界面。modal view controller只能用在臨時的交互或者短期的交互中。

Page 235
創(chuàng)建UiImagePickerController對象和創(chuàng)建其他對象一樣,首先聲明一個變量,然后調(diào)用初始化:
var imagePicker = UIImagePickerController()
Cameras(相機)
在使用UiImagePickerController之前需要先檢查一下當(dāng)前設(shè)備的相機是否可用,在某些情況下,設(shè)備雖然有相機但是是不能用的。檢查設(shè)備相機是否可用的代碼:
if UIImagePickerController.isSourceTypeAvailable(.Camera) {
//Camera is Available
} else {
//Camera not Available
}
如何相機可用,則可以設(shè)置UiImagePickerController來調(diào)用相機獲取拍攝圖片或者視頻。把UiImagePickerController設(shè)置成相機模式,需要把sourceType屬性設(shè)置為.Camera :
imagePicker.sourceType = .Camera
Page 236 | Chapter 9 : Camera, Photos, and Social Networks
很多iOS設(shè)備有前后兩個攝像頭。檢查前置攝像后可用還是后置攝像頭可用,我們使用isCameraDeviceAvailable這個方法。把攝像頭的位置傳給isCameraDeviceAvailable,然后這個方法就會返回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è)備沒有可用的攝像頭,UiImagePickerController可以讓用戶從相冊中選擇圖片或者視頻。把sourceType屬性設(shè)置成.PhotoLibrary就可以展示選擇圖片界面了:
imagePicker.sourceType = .PhotoLibrary
在iOS模擬器中測試App有時候會有局限性,因為模擬器沒有攝像頭。永遠(yuǎn)不要假設(shè)設(shè)備有相機,總是檢查是否有攝像頭。為了測試攝像頭功能,你必須在真機上運行應(yīng)用,在真機上運行應(yīng)用的知識我們將會在第十章進(jìn)行詳細(xì)的介紹。
Media Types (媒體類型)
媒體的類型可以設(shè)置為圖片、視頻、和圖片+視頻。默認(rèn)設(shè)置是圖片+視頻。想要改變這個設(shè)置,需要引入Mobile Core Services framework(Mobile Core Services框架)。
首先點擊Project Navigator中的工程名稱,顯示工程的詳細(xì)信息,然后滑到底部,找到Linked Frameworks and Libraries這部分,點擊左下角的加號,在搜索框中輸入MobileCoreServices,選擇MobileCoreServices.framework,點擊Add按鈕。
這樣MobileCoreServices.framework文件就添加到你的Project Navigator中了,接著你需要在代碼中添加這行代碼:
import MobileCoreServices
有了這行代碼,MobileCoreServices.framework類就會添加到你代碼中,你可以使用這個框架了。下面是每個媒體類型的關(guān)鍵詞:
UIImagePickerController | Page 237
kUTTypeImage 相片和圖片
kUTTypeMovie 電影和視頻
用數(shù)組來設(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)用戶存儲一個新的媒體時,就觸發(fā)了一個delegate updates。為了能夠收到這些updates,我們需要把UiImagePickerController委托到當(dāng)前的view controller,使用self關(guān)鍵詞來表示當(dāng)前的view controller。例如:
imagePicker.delegate = self
當(dāng)然,我們還要保證當(dāng)前的view controller已經(jīng)遵從了UiImagePickerController協(xié)議,遵從協(xié)議的方法很簡單,就在當(dāng)前的view controller中添加這行代碼:
class ViewController: UIViewController, UIImagePickerControllerDelegate {
因為UiImagePickerController繼承自UINavigationController,所以還要遵從UINavigationController協(xié)議,這份協(xié)議提供UINavigationController如push和pop等事件的updates,你的view controller必須要遵從協(xié)議,但是協(xié)議中方法(methods)都是可選的。詳見代碼:
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
Page 238 | Chapter 9 : Camera, Photos, and Social Networks
Working with Images
UIImagePickerControllerDelegate有兩個方法來處理媒體,第一個方法是imagePickerController(_: didFinishPickingImage),當(dāng)相機拍攝了一張圖片或者從相冊中選擇了一張圖片后,這個方法就會觸發(fā)delegate。如果用戶是創(chuàng)建或選擇的視頻,那么這個方法不會被調(diào)用。這個方法提供了UIImage參數(shù),來包括新創(chuàng)建的圖片。為了能夠出發(fā)這個事件,我們需要添加下列代碼:
func imagePickerController(picker: UIImagePickerController!,didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!){
}
Working with Multiple Media Types
第二個方法更高級一些,是imagePickerController(_:, didFinishPickingMediaWithInfo _:),當(dāng)用戶創(chuàng)建選擇了圖片視頻,這個方法會觸發(fā)委托。如果sourceType設(shè)置為.PhotoLibrary,那么這個方法會在用戶選中圖片或視頻后被調(diào)用;如果sourceType設(shè)置為.Camera,用戶拍攝了圖片或視頻并且確認(rèn)保存后,這個方法才會被調(diào)用。info參數(shù)值為新圖片視頻提供了額外的信息。
添加下列代碼可激活這個事件:
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)將會提供所選內(nèi)容的具體值:
UIImagePickerControllerMediaType
Media type媒體類型,類如:kUTTypeImage 或者 kUTTypeMovie
UIImagePickerControllerOriginalImage
原始未裁剪的圖片
UIImagePickerControllerEditedImage
編輯過的圖片,只有allowsEditing設(shè)置為true
UIImagePickerController | Page 239
UIImagePickerControllerCropRect
將原始圖片矩形裁剪
UIImagePickerControllerMediaURL
視頻在本地文件中的路徑(僅限視頻)
UIImagePickerControllerReferenceURL
用于高級視頻框架的URL(URL used with advanced video framework)
UIImagePickerControllerMediaMetadata
僅限圖片,字典中圖片的元數(shù)據(jù)(Photos only, dictionary full of metadata for image)
所有的這些鍵都能獲取到媒體的更多信息,最常用的鍵是UIImagePickerControllerMediaType , UIImagePickerControllerOriginalImage , 和 UIImagePickerControllerMediaURL 。
mediaType覆蓋后,運行if語句來檢測是圖片還是視頻(這話原話是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的類型是圖片,那么圖片的會直接傳入到 info參數(shù)中,新圖片會直接從字典中提取出來放入到UIImage,UIImage這個類是用來存儲圖片的,UIImage的圖片傳給UIImageView,UIImageView就像是相片的相框,它能把圖片裝裱起來,圖片也能隨時更換
UIImageView在用戶界面上展示UIImage的內(nèi)容。例如:
var myImage = info[UIImagePickerControllerOriginalImage] as UIImage
把圖片放入UIImageView的方法:把UIImageView的image屬性設(shè)置為UIImagePickerControllerOriginalImage的鍵:
imageView.image = myImage
Page 240 | Chapter 9 : Camera, Photos, and Social Networks
Video in didFinishPickingMediaWithInfo
如果mediaType的類型是視頻,視頻不會直接存儲到字典中,而是存儲視頻文件的路徑,用
UIImagePickerControllerMediaURL鍵來獲取。獲取路徑而不是直接獲取視頻,有一個非常大的好處,能夠節(jié)省電量和內(nèi)存。視頻路徑可以傳遞給MPMoviePlayerViewController,在用戶屏幕上播放。獲取視頻的代碼:
var videoPath = info[UIImagePickerControllerMediaURL as NSURL
MPMoviePlayerViewController這個類能夠讓開發(fā)視頻播放的工作更簡單,給MPMoviePlayerViewController一個視頻路徑,就能播放視頻,也能在播放過程中做一些簡單的操作。MPMoviePlayerViewController需要Media Player framework這個框架。
首先點擊Project Navigator中的工程名稱,顯示工程的詳細(xì)信息,然后滑到底部,找到Linked Frameworks and Libraries這部分,點擊左下角的加號,在搜索框中輸入MediaPlayer,選擇MediaPlayer.framework,點擊Add按鈕。
這樣MediaPlayer.framework文件就添加到你的Project Navigator中了,接著你需要打開view controller,然后把鼠標(biāo)放到import UIKit下方,然后添加這行代碼:
import MediaPlayer
這行代碼會把MediaPlayer.framework類引入到當(dāng)前代碼中,MediaPlayer.framework中包括MPMoviePlayerViewController這個類。
接著,和創(chuàng)建其他的對象一樣,創(chuàng)建一個MPMoviePlayerViewController,接著設(shè)置它的contentUIRL屬性:
var videoPath = info[UIImagePickerControllerMediaURL as NSURL]
var myMoviePlayerViewController = MPMoviePlayerViewController()
myMoviePlayerViewController.moviePlayer.contentURL = videoPath
Presenting UIImagePickerController
展示新的view controller,我們使用presentViewController這個方法:
self.presentViewController(imagePicker, animated: true, completion: nil)
UIImagePickerController | Page 241
Integrating with Social Networks (加入社交網(wǎng)絡(luò)功能)
在很多手機應(yīng)用中,把內(nèi)容分享到社交網(wǎng)絡(luò)上已經(jīng)成為一個核心的特性,然而,把所有的社交網(wǎng)絡(luò)都整合到App中會非常花費時間,蘋果公司提供了Social framwork讓開發(fā)分享功能更簡單。Social framework中包括SLComposeViewController,SLComposeViewController這個類可以讓用戶把內(nèi)容分享到Twitter和Facebook。SLComposeViewController使用用戶在iPhone設(shè)置中填寫的登錄帳號密碼,這就說明開發(fā)者不必自己寫代碼就可以分享到Facebook和Twitter了,用戶可以分享文字、鏈接甚至是圖片。
在使用SLComposeViewController之前,我們需要先把Social framework引入到工程當(dāng)中。首先點擊Project Navigator中的工程名稱,顯示工程的詳細(xì)信息,然后滑到底部,找到Linked Frameworks and Libraries這部分,點擊左下角的加號,在搜索框中輸入Social,選擇Socail.framework,點擊Add按鈕。這樣Social.framework文件就添加到你的Project Navigator中了,接著你需要打開view controller,然后把鼠標(biāo)放到import UIKit下方,然后添加這行代碼:
import Social
Setting the Social Network (設(shè)置社交網(wǎng)絡(luò))
上面這行代碼會把Social framework引入到view controller中,使SLComposeViewController可以在代碼中使用了。在創(chuàng)建SLComposeViewController時需要提供serviceType,serviceType類型有兩個選項:
SLServiceTypeFacebook
Facebook
SLServiceTypeTwitter
Twitter
首先要核實需要的service是否可用,使用isAvailableForServiceType(_: )來檢查service類型在當(dāng)前設(shè)備是否可用:
if (SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook)) {
//Facebook available
}
我們可以使用_(forServiceType:)方法來創(chuàng)建SLComposeViewController,有一個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)文案會出現(xiàn)分享界面,提前給用戶寫好,用戶可以直接就分享出去,當(dāng)然也可以刪除或者修改文案。我們用setInitialText(_:)方法來創(chuàng)建默認(rèn)文案:
var myComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
myComposeViewController.setInitialText("I love this app!")
Adding Images (增加分享圖片)
SLComposeViewController也支持圖片分享,使用addImage(_:)方法,這個方法有一個UIImage參數(shù):
myComposeViewController.addImage(myImage)
Adding URLs
如果不能分享鏈接那么分享就沒有意義了,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這個呈現(xiàn)方式,使用presentViewController(_:,animated: completion: )方法,例如:
self.presentViewController(myComposeViewController,animated: true, completion: nil)
這樣SLComposeViewController就會展示在用戶面前,用戶分享內(nèi)容。如果用戶還沒有登錄社交網(wǎng)絡(luò),iOS會引導(dǎo)他到設(shè)置中的登錄界面完成操作。
現(xiàn)在是時候把知識應(yīng)用到實踐中去了,來創(chuàng)建一個自拍照App吧。
Integrating with Social Networks | Page 243