138

私の .plist ファイルでは、「コントローラ ベースのステータス バーの外観を表示する」を に設定していNOます。しかし、 の後UIImagePickerController、オプションが に設定されているかのようにアプリが動作しますYES

私のアプリでは、UIImagePickerController.

問題は次のように発生します。

  • フォト ピッカーが表示された後、フォト ライブラリが選択されると、ステータス バーのテキストの色が変わります。
  • その後、いったんUIImagePickerController閉じられると、残りのアプリのステータス バーの間隔が変更され、他のコントローラーのすべてのナビゲーション バーがステータス バーの下に表示されます。

ビューコントローラーでステータスバーを管理せずにこれを解決する方法はありますか?

4

25 に答える 25

84

今日も同じ問題に直面しました。これが私の解決策です。

イメージ ピッカーを呼び出すビュー コントローラーで、自分自身をイメージ ピッカーのデリゲートとして設定します。(あなたはおそらくすでにこれをやっています)

UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;

UIImagePickerController はナビゲーション コントローラーの一種であるため、自分自身を UINavigationController デリゲートとしても設定しています。それで :

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

UIStatusBarStyleLightContent を探しているスタイルに置き換えます。

于 2013-09-18T22:47:09.577 に答える
10

.plist ファイルで「ビュー コントローラー ベースのステータス バーの外観」を NO に設定すると、受け入れられた回答が機能します。実際に他のいくつかのView Controllerでステータスバーを制御する必要があり、このオプションをYESに設定している場合、UIImagePickerControllerを正しく動作させるもう1つの方法は、それをサブクラス化することです

// .h
@interface MYImagePickerController : UIImagePickerController
@end

// .m
@implementation MYImagePickerController
- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent; // change this to match your style
}
@end
于 2014-04-22T16:41:50.547 に答える
6

私は同じ問題に直面しました。

ここに私の解決策があります。これを、画像ピッカービューを開く元のView ControllerのviewWillAppearに入れます

-(void) viewWillAppear:(BOOL)animated{
[super viewWillAppear:YES];

[[UIApplication sharedApplication] setStatusBarHidden:YES];

}
于 2013-09-20T08:08:20.367 に答える
4

これを試すことができますか。needsStatusBarApperanceUpdate が機能すると思います。

1 -Set UIViewControllerBasedStatusBarAppearance to NO.
2- Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
3- [self setNeedsStatusBarAppearanceUpdate];
于 2013-09-25T20:35:08.523 に答える
4

私はこれが適切な取り扱いを提供することを発見しました.2つの部分があります.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
}


- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
...

UIImagePickerController 自体がビュー コントローラーを提示するため、このデリゲートはスタック上のすべてのプレゼンターに対して機能します。

viewWillAppear は、表示中のビュー コントローラーがその上で閉じられるたびに、このビュー コントローラー自体が常にリセットされるようにします。

于 2014-03-21T16:49:29.690 に答える
3

私も同じ問題を抱えていました。情報 plist に追加: 「コントローラーベースのステータスバーの外観を表示」、値は「NO」

ここの例https://stackoverflow.com/a/19211669

このソリューションは私にとってはうまくいきます。

于 2014-02-28T11:16:31.150 に答える
2

上記のすべてがうまくいきませんでした。プレゼンテーション スタイルを次のように変更することで問題を解決しました。

imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;
于 2014-06-04T10:34:05.720 に答える
2

これはおそらくバグです。「ビューコントローラーベースのステータスバーの外観」をYESに設定し、すべてのビューコントローラーで次のコードを貼り付けることで、問題を解決しました。

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

その後、アプリは期待どおりに動作します。

于 2013-09-19T11:15:52.153 に答える
2

上記の解決策はどれもうまくいきませんでした。

UIImagePickerController をモーダル ビュー コントローラーとして提示します。UIImagePickerController を閉じると、ステータス バーの状態は次のようになりました。

[UIApplication sharedApplication].statusBarOrientation = 0 (UIDeviceOrientationUnknown)
[UIApplication sharedApplication].statusBarFrame = { 0, 0, 0, 0}

私の問題を解決した解決策は、UIImagePickerController を閉じた後に statusBarOrientation を復元することでした:

UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
[self.viewController presentViewController:cameraUI animated:true completion:^(void){ }];

...

[self.viewController dismissViewControllerAnimated:animated completion:^(void){
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}];
于 2014-06-20T09:24:21.430 に答える
2

上記のすべての回答は問題なく、役に立ちます。

異なる iOS バージョンで実行されるアプリケーションを管理しなければならないという同じ問題がありました。

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

if(IS_IOS8_AND_UP) {
    imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;
} else {
    imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
}

imagePickerController.delegate = self;
[self presentViewController:imagePickerController animated:YES completion:nil];

次に、デリゲートで:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    /* Cancel button color  */
    _imagePicker.navigationBar.tintColor = <custom_color>
    /* Status bar color */
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}
于 2014-12-10T09:25:11.067 に答える
2

このコードは、ステータス バーのスタイルをカスタマイズするのに役立ちました。

編集:このソリューションは、「コントローラーベースのステータスバーの外観を表示する」==はいの場合に機能します

@implementation UIImagePickerController (IOS7_StatusBarStyle)

-(UIViewController*)childViewControllerForStatusBarStyle
{
   return nil;
}

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

@end
于 2014-08-12T08:55:36.237 に答える
1

iOS 8.1 の時点で、ようやくこのバグが修正されたようです。採用したすべての回避策をコードから削除することができました。

于 2014-11-05T05:09:48.153 に答える
1

ここでは、私が抱えていた問題 (そしておそらく OP も抱えていた問題) を具体的に修正したものは何もないので、答えを共有したいと思いました。バグのある解決策だと思うステータスバーを非表示にする代わりに(ステータスバーが非表示であるべきではないときに、アプリが非表示の状態になることがあることに気付きました)。代わりに、 でうまくプレイすることにしましたUIStatusBarStyles

UIImagePickerController のビューが表示されたら、ステータス バーのスタイルをデフォルトに設定します。これは、デフォルトの背景色が明るい灰色であるためです。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];
}

次に、イメージ ピッカーを閉じたら、元に戻しUIStatusBarStyleLightContentます。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //work

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

    [self dismissViewControllerAnimated:YES completion:NULL];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{ 
    //work

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

    [self dismissViewControllerAnimated:YES completion:NULL];
}
于 2014-03-03T20:41:10.550 に答える
1

この場合、2 つのステップを使用しています。

最初のステップ: info.plist に追加: "コントローラーベースのステータスバーの外観を表示" 値 "NO"

2番目のステップ: UIImagePickerController のデリゲートでこのコードを使用/呼び出します

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
     if([navigationController isKindOfClass:[UIImagePickerController class]])
         [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
 }

IOS-7 の場合、One more Function を追加します。

- (BOOL)prefersStatusBarHidden
{
    return YES;
}
于 2014-04-19T10:48:17.967 に答える
1

デフォルトの iOS 8 の動作を使用すると、非表示にしたいときにステータス バーが表示されるという問題がありました。

presentPopover私が見つけた解決策は、View Controllerから呼び出した直後に次のことを行ったことです。

    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate) withObject:nil afterDelay:0.01];

これをメインのView Controllerにも追加する必要がありました:

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}
于 2014-11-12T17:01:21.380 に答える
1

これで解決しました...:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:nil];
}
于 2014-02-01T10:05:22.860 に答える
1

[self setNeedsStatusBarAppearanceUpdate]表示中のビュー コントローラーが再表示されたときに呼び出してみましたか?

于 2013-09-18T19:10:49.600 に答える
-1

実際、イメージ ピッカーでステータス バーの背景色を設定するより良い方法を見つけました。基本的に、navigationBar の backgroundImage を nil に設定する必要があります。これは、Image Picker のデフォルトで backgroundImage が白い Image であるためです。

于 2016-01-22T15:48:16.637 に答える