iOS開發(fā)初學(xué)者入門 | 第九章:相機、相冊和社交網(wǎng)絡(luò)

在這一章節(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只能用在臨時的交互或者短期的交互中。

圖9-1 UiImagePickerController

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

Exercise: A Selfie App

練習(xí)請見此鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容