2014-12-07 69 views
0

我使用UIViewControllerBasedStatusBarAppearancepreferredStatusBarStyle來管理狀態欄的顏色和外觀。作物中的UIImagePickerController狀態欄問題

我的應用程序允許用戶從他的相機膠捲中選擇一張照片,並使用UIImagePickerController的原生裁剪選項將其裁剪爲正方形。

所以我推UIImagePickerController並啓用編輯來獲取裁剪屏幕。
問題是,我想爲相冊和照片查看,狀態欄將是白色的,而對於裁剪視圖,我想隱藏狀態欄。

我該怎麼做preferredStatusBarStyle

到現在爲止我做了一個類別UIImagePickerController和實施:

- (UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
} 

這確實是設置照片的狀態欄白色的顏色,但要裁剪視圖時,狀態欄將變爲黑色,這可能是對我很好,因爲我想隱藏它,背景是黑色的,所以你看不到它,但電池指示燈是綠色的!所以你只能看到狀態欄中的電池指示器!

我該如何解決這個問題?我怎樣才能只在裁剪視圖中隱藏狀態欄?

回答

0

你將不得不在這裏做一些偵探工作,但我可以給你一個領導。

我建議子類UIImagePickerController並根據顯示的子控制器返回您的狀態欄首選項。

UIViewController中有兩個方法,使您可以控制狀態欄的可見性和外觀:

- (BOOL)prefersStatusBarHidden; 
- (UIStatusBarStyle)preferredStatusBarStyle 

簡單地覆蓋它們,沒有super通話需要。

您可以訪問子類中的視圖控制器堆棧,以便根據堆棧上的控制器數量選擇狀態欄的首選樣式和可見性。

我有一種感覺,UIKit每次將新的子控制器推入堆棧時,都會ping preferredStatusBarStyleprefersStatusBarHidden

如果沒有,那麼你可以強制UIKit的調用來更新狀態欄:

[self setNeedsStatusBarAppearanceUpdate] 

由於UIImagePickerControllerUINavigationController一個子類,你可以自己委託給它分配,監控,當新的控制器被推堆棧,並調用上面的建議代碼。

+0

但我的問題是,我不知道UIImagePickerController推動哪個控制器,它的所有私人。例如它可以堆疊幾個視圖控制器:專輯,照片和裁剪。如果我只想隱藏作物控制器中的狀態欄,我怎麼知道? – Mario 2014-12-08 08:32:24

+0

對,您可以使用'NSStringFromClass(s​​elf.topViewController.class)'來獲取私有類的字符串名稱。這樣你可以識別控制器。 – Andy 2014-12-08 09:38:46

+1

我想你會發現,一個父視圖控制器的'prefersStatusBarHidden'不會再次調用一個孩子被推動,除非使用'setNeedsStatusBarAppearanceUpdate'。 – 2014-12-23 21:22:02

0

排序的後續到Andy的帖子,是子類UIImagePickerController曾被禁止,但現在被允許。雖然有一些意想不到的問題試圖覆蓋prefersStatusBarHiddenpreferredStatusBarStyle

請注意UIImagePickerControllerUINavigationController的子類,所以它本身就是子視圖控制器的容器。容器視圖控制器如何控制其子項的狀態欄可見性和樣式是通過覆蓋childViewControllerForStatusBarHiddenchildViewControllerForStatusBarStyle。通常UINavigationController不會實現這些,通常會覆蓋它們以返回當前可見的視圖控制器。

在這種情況下,如果你不控制子視圖控制器,你的選擇器子類可以覆蓋這些方法返回nil,然後你的prefer方法的實現應該接管。從理論上講,你只需要在正確的時間讓他們回報你所需要的東西,但正如我的經驗所證明的那樣,UIImagePickerController和狀態欄的風格會帶來一些腥意。


對於我自己UIImagePickerController子類,我不關心賦予其自定義UI子視圖控制器,但我已經從childViewController..返回nil和重寫prefer方法試驗。我發現,控制可見性工作正常,但在選擇器來抵消我的子類從preferredStatusBarStyle返回LightContent。見my own question