在最近的項(xiàng)目中,因?yàn)橐o設(shè)置頭像,需要訪問(wèn)到相冊(cè),本來(lái)覺(jué)得這是一個(gè)很簡(jiǎn)單的問(wèn)題,直接調(diào)用 UIImagePickerController 從相冊(cè)選擇照片就可以了,一直以來(lái)也是這么做的,,但是以前都是在 iPhone 上實(shí)現(xiàn)的,這次是在 iPad 上實(shí)現(xiàn),并且我們的項(xiàng)目是只支持橫屏的,所以在條用相冊(cè)的時(shí)候,程序直接就 crash 了,這是讓我沒(méi)有想到的,錯(cuò)誤原因是
Supported orientations has no common orientation with the application, and [PUUIAlbumListViewController shouldAutorotate] is returning YES
在網(wǎng)上查閱到的解決辦法大都是該 UIImagePickerViewController 添加一個(gè)類別,重寫(xiě)它的設(shè)備方向的方法,下面是一個(gè) stack overflow 上面的答案

在程序中我試過(guò)這種方法,然而并沒(méi)有什么用。
同時(shí)在這個(gè)答案的下面還有另外一種方法,是可以解決程序崩潰的,但是這種呈現(xiàn)的效果,好吧,我不想吐槽 ╮(╯▽╰)╭
將圖片的取景框放在當(dāng)前的視圖上,sourceRect 決定放的位置,直接截取了

這種呈現(xiàn)的效果就是想 UIPopoverController 的效果。
但是的但是,這并不是我要的效果,難道就沒(méi)有其他的解決辦法了嗎,哦,my god .
被這個(gè)問(wèn)題困擾了挺長(zhǎng)一段時(shí)間的,但是慶幸,后來(lái)還是解決了,先給自己贊一個(gè) ?(*^__^*)
還是受的 stack overflow 上面的解決辦法的啟發(fā),既然相冊(cè)不支持橫屏,那就是說(shuō)在調(diào)用相冊(cè)的時(shí)候讓設(shè)備支持所有方向就好了,當(dāng)取消相冊(cè)的時(shí)候在讓設(shè)備又只支持橫屏好了,當(dāng)時(shí)只是在調(diào)用相冊(cè)的那個(gè) viewController 中重寫(xiě)設(shè)備支持方法,結(jié)果自然是沒(méi)有什么卵用,后來(lái)嘗試在入口類里重寫(xiě)方法
? ??- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window { ? ? ? ?returnUIInterfaceOrientationMaskAll; ?}
這樣自然是可以的,但是這樣造成的問(wèn)題就是,當(dāng)取消相冊(cè)的時(shí)候,設(shè)備并沒(méi)能切回只支持橫屏,到了這一步,能想到的是就是當(dāng)調(diào)用和取消調(diào)用相冊(cè)的時(shí)候通知設(shè)備應(yīng)該支持哪些方向,設(shè)置頭像的 viewController 層次比較深,本來(lái)準(zhǔn)備使用通知,但是并沒(méi)有成功,具體的原因有些忘記了,⊙﹏⊙b汗
正在冥思苦想的時(shí)候,突然意識(shí)到我在項(xiàng)目里有運(yùn)用到 單例類,就想說(shuō)我是不是能給單例類一個(gè)標(biāo)識(shí),用來(lái)標(biāo)識(shí)是否在調(diào)用相冊(cè),最后的結(jié)果是這樣的

實(shí)驗(yàn)的結(jié)果自然是成功的,切回當(dāng)前程序的時(shí)候,旋轉(zhuǎn)屏幕,并沒(méi)有發(fā)生 UI 離開(kāi)位置的情況,但使用過(guò)程中,還有一個(gè)地方不是很好,就是調(diào)用相冊(cè)的時(shí)候,相冊(cè)顯示是以豎屏的狀態(tài)呈現(xiàn)的,用戶在使用的時(shí)候要先旋轉(zhuǎn)屏幕到豎屏,切回程序的時(shí)候又要旋轉(zhuǎn)回橫屏,使用起來(lái)不是很舒服,最后想到的解決辦法是給 UIImagePickerController 指定支持的方向?yàn)?橫屏方向

總結(jié)了一下,每次調(diào)用一個(gè) 視圖控制器 的時(shí)候,都會(huì)調(diào)用指定支持屏幕的方法 - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 同時(shí)在一個(gè)視圖控制器顯示的時(shí)候,會(huì)調(diào)用自己的 支持屏幕方向 supportedInterfaceOrientations 的方法,所以才能在 UIImagePickerController 顯示的時(shí)候通過(guò)指定支持方向來(lái)改變 其在用戶面前展現(xiàn)的方向。