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

在這一章節(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í)的交互或者短期的交互中。

圖9-1 UiImagePickerController

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

Exercise: A Selfie App

練習(xí)請(qǐng)見(jiàn)此鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轩娶,一起剝皮案震驚了整個(gè)濱河市儿奶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳄抒,老刑警劉巖闯捎,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異许溅,居然都是意外死亡瓤鼻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門闹司,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)娱仔,“玉大人,你說(shuō)我怎么就攤上這事游桩∩龋” “怎么了耐朴?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盹憎。 經(jīng)常有香客問(wèn)我筛峭,道長(zhǎng),這世上最難降的妖魔是什么陪每? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任影晓,我火速辦了婚禮,結(jié)果婚禮上檩禾,老公的妹妹穿的比我還像新娘挂签。我一直安慰自己,他們只是感情好盼产,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布饵婆。 她就那樣靜靜地躺著,像睡著了一般戏售。 火紅的嫁衣襯著肌膚如雪侨核。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天灌灾,我揣著相機(jī)與錄音搓译,去河邊找鬼。 笑死锋喜,一個(gè)胖子當(dāng)著我的面吹牛些己,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跑芳,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼轴总,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了博个?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤功偿,失蹤者是張志新(化名)和其女友劉穎盆佣,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體械荷,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡共耍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吨瞎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痹兜。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖颤诀,靈堂內(nèi)的尸體忽然破棺而出字旭,到底是詐尸還是另有隱情对湃,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布遗淳,位于F島的核電站拍柒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏屈暗。R本人自食惡果不足惜拆讯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望养叛。 院中可真熱鬧种呐,春花似錦、人聲如沸弃甥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)潘飘。三九已至肮之,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卜录,已是汗流浹背戈擒。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艰毒,地道東北人筐高。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像丑瞧,于是被迫代替她去往敵國(guó)和親柑土。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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