UIImagePickerController durum çubuğu görünümünü kesiyor


137

.Plist dosyamda " Görünüm denetleyicisi tabanlı durum çubuğu görünümünü " olarak ayarladım NO. Ancak UIImagePickerController, uygulamam seçenek olarak ayarlanmış gibi davranıyor YES.

Benim uygulamasında bir VC o hediyeler bir takdim UIImagePickerController.

Sorun şu şekilde olur:

  • Fotoğraf seçici sunulduktan sonra, bir fotoğraf kütüphanesi seçildiğinde, durum çubuğu metninin rengi değişir.
  • Sonra bir kez, UIImagePickerControllerkapatılır, benim app geri kalanı için durum çubuğu aralığı değişir ve diğer denetleyiciler için tüm gezinti çubuğu durum çubuğu altında görüntülenir.

Görünüm denetleyicilerimdeki durum çubuğunu yönetmeden bunu çözmenin bir yolu var mı?


Benim durumumdaki cevap çocuk denetleyicileriyle bağlantılıydı. Yeniden kullanmak yerine onları yeniden yaratmak zorunda kaldım.
Alex L

7
Bu gerçekten bir iOS 7 hatası gibi görünüyor, kimse Apple ile bir rapor yaptı mı?
Dan F

stackoverflow.com/questions/21225978/… basit çözüm ile benzer soru
Ting Wu

Hey @AlexL, neden olduğunu biliyor musun?
Shabarinath Pabba

Yanıtlar:


192

Yukarıdaki çözümlerin hiçbiri benim için çalışmadı, ancak Rich86man ve iOS_DEV_09'un cevaplarını birleştirerek sürekli çalışan bir çözüm buldum:

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

ve

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

Bu harika çözüm ile ilgili. 2014 / iOS8 için bazı durumlarda AYRICA dahil etmeniz gerektiğini prefersStatusBarHiddenve muhtemelen childViewControllerForStatusBarHidden...

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

-(BOOL)prefersStatusBarHidden   // iOS8 definitely needs this one. checked.
    {
    return YES;
    }

-(UIViewController *)childViewControllerForStatusBarHidden
    {
    return nil;
    }

-(void)showCamera
    {
    self.cameraController = [[UIImagePickerController alloc] init];
    self.cameraController.delegate = (id)self; // dpjanes solution!
    etc...

Umarım birine yardımcı olur


3
Bu bir hiledir (Rich86man'ın dediği gibi): "UIImagePickerController bir tür Gezinti denetleyicisi olduğundan, aynı zamanda kendinizi UINavigationController temsilcisi olarak da ayarlıyorsunuz."
Beto

2
UIImaegPicker kapatıldıktan sonra ne olacak ..? statusbar gizlemek yanlış ayarlamak sonra arka plan siyah olacak.
Nitin Gohel

Yukarıdaki soruya göre plist ayarladınız mı?
dpjanes

UIImagePickerControllerSourceTypePhotoLibrary'yi kullanırken, bazı albümleri açıp ardından biraz geriye kaydırıp hareketi iptal ederken sorunu fark ettiniz mi?
Kukosk

3
Durum çubuğu çok sarsıntılı bir şekilde içeri ve dışarı açılır, ancak bu çalışır. Apple'a bir hata bildirdim.
jjxtra

84

Aynı sorunla bugün karşılaştım. İşte benim çözümüm.

Görüntü seçiciyi çağıran görünüm denetleyicisinde, kendinizi görüntü Seçici'nin temsilcisi olarak ayarlayın. (Muhtemelen bunu zaten yapıyorsunuz)

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

UIImagePickerController bir tür Gezinti denetleyicisi olduğundan, aynı zamanda kendinizi UINavigationController temsilcisi olarak ayarlıyorsunuz. Sonra :

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

UIStatusBarStyleLightContent'i, aradığınız stille değiştirin.


10

.Plist dosyanızda 'Denetleyici tabanlı durum çubuğu görünümünü görüntüle' seçeneği HAYIR olarak ayarlanmışsa, kabul edilen yanıt çalışır. Gerçekten de bazı görünüm denetleyicilerindeki durum çubuğunu denetlemeniz ve bu seçeneği EVET olarak ayarlamanız gerekiyorsa, UIImagePickerController'ın doğru davranmasını sağlamanın diğer yolu alt sınıflandırmadır.

// .h
@interface MYImagePickerController : UIImagePickerController
@end

// .m
@implementation MYImagePickerController
- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent; // change this to match your style
}
@end

6

aynı sorunla karşılaştım.

işte benim çözümüm. bunu görüntü alma görüntüsünü açtığınız görünüm denetleyicisinin görünümü

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

[[UIApplication sharedApplication] setStatusBarHidden:YES];

}

4

Bunu deneyebilir misin? Ben ihtiyaçStatusBarApperanceUpdate çalışacağını düşünüyorum.

1 -Set UIViewControllerBasedStatusBarAppearance to NO.
2- Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
3- [self setNeedsStatusBarAppearanceUpdate];

4

Bunu uygun kullanım için buldum, iki bölüm var.

- (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'ın kendisi görünüm denetleyicileri sunar, bu nedenle bu temsilci yığındaki tüm sunucular için çalışır.

viewWillAppear, sunan bir görünüm denetleyicisinin üstünden her defasında bu görünüm denetleyicisinin kendisinin her zaman sıfırlanmasını sağlar.


3

Ben de aynı problemi yaşadım. Bilgi plistine ekle: "NO" değeriyle "Denetleyici tabanlı durum çubuğu görünümünü görüntüle"

Burada örnek https://stackoverflow.com/a/19211669

Bu çözüm benim için çalışıyor.


2

Bu muhtemelen bir hata. Sorunu, "Kontrolör tabanlı durum çubuğu görünümünü görüntüle" EVET olarak ayarlayarak ve her bir görünüm denetleyicisinde aşağıdaki kodu yapıştırarak çözdüm:

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

Sonra benim app beklendiği gibi davranır.


2

UIImagePicker'daki durum çubuğunu gizlemek için:

-

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

ve Görünüm denetleyicisindeki durum çubuğunu gizlemek için UIImagePicker kapatıldığında aşağıdaki kodu kullanın:

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

    [[UIApplication sharedApplication] setStatusBarHidden:YES];

}

2

bunu dene ....

Bu, her iki durumda da çalışacaktır, yani presentModalViewController ve pushViewController

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

delege yöntemleri

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:^{}];
}


- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:nil];
}

2

Yukarıdakilerin hepsi benim için işe yaramadı. Sunum stilini şu şekilde değiştirerek sorunu çözdüm:

imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;

2

Yukarıdaki çözümlerin hiçbiri benim için işe yaramadı.

Modsal görünüm denetleyicisi olarak UIImagePickerController'ı sunuyorum. UIImagePickerController kapatıldıktan sonra durum çubuğu durumu:

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

Sorunu benim için çözen çözüm, UIImagePickerController'ı çıkardıktan sonra statusBarOrientation'ı geri yüklemekti:

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

...

[self.viewController dismissViewControllerAnimated:animated completion:^(void){
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}];

2

Bu kod durum çubuğu stilini özelleştirmeme yardımcı oldu.

EDIT: "Çözüm denetleyicisi tabanlı durum çubuğu görünümünü görüntüle" == EVET ise bu çözüm çalışır

@implementation UIImagePickerController (IOS7_StatusBarStyle)

-(UIViewController*)childViewControllerForStatusBarStyle
{
   return nil;
}

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

@end

2

Yukarıdaki tüm cevaplar tamam ve yardımcı olabilir.

Farklı iOS sürümleri altında çalıştırılan uygulamayı yönetmek zorunda kalırken de aynı sorunu yaşadım .

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];

Ardından, temsilci olarak:

- (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];
}

2

Yine de bazı durumlarda işe yarayabilecek başka bir çözüm.

let imagePicker =  UIImagePickerController()
imagePicker.sourceType = .PhotoLibrary
imagePicker.navigationBar.barStyle = .Black

1

[self setNeedsStatusBarAppearanceUpdate]Sunum görünüm denetleyiciniz yeniden göründüğünde aramayı denediniz mi?


Muhtemelen bir hata - örnek bir proje ile bir radar
dosyalayıp

1

İOS7'de UIImagePickerController'daki durum çubuğunu gizlemeye çalışıyorum, ancak yine de bunu nasıl yapacağımı bilmiyorum. kullanırım

- (void)viewWillAppear:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES
                                        withAnimation:UIStatusBarAnimationNone];
}

UIImagePickerController'ı çağıran ve plist dosyasında "Görünüm denetleyicisi tabanlı durum çubuğu görünümünü = HAYIR" olarak ayarlayan ViewController'da. Umarım bu yardımcı olabilir.


1

bunu dene :

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

ve protokol uygulamasında şunu kullanın:

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

1

Bu benim için çözdü ...:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:nil];
}

1

Burada hiçbir şey, sahip olduğum (ve belki de OP'nin de olduğu) sorunu çözmedi, bu yüzden cevabımı paylaşacağımı düşündüm. Bunun yerine, buggy bir çözüm olduğunu düşündüğüm durum çubuğunu gizlemek yerine (bazen uygulamamı durum çubuğunun olmaması gerektiği zaman gizli olduğu bir durumda bırakacağımı fark ettim). Bunun yerine ile güzel oynamayı seçtim UIStatusBarStyles.

UIImagePickerController'ın görünümü sunulduğunda, varsayılan arka plan rengi açık gri olduğundan durum çubuğu stilini varsayılan olarak ayarladım.

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

Ardından, görüntü seçici kapatıldığında, öğeyi 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];
}

1

Bu durumda, 2 adım kullanıyoruz

İlk adımda ekleyin: info.plist: "NO" değerine sahip "denetleyici tabanlı durum çubuğu görünümünü görüntüle"

İkinci adımda: Bu kodu UIImagePickerController temsilcisiyle kullanın / çağırın

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

IOS-7 durumunda bir tane daha fonksiyon ekleyin

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

1

İOS 8.1'den itibaren, bu hatayı sonunda düzeltmiş gibi görünüyor! Kodumdan kullandığım tüm geçici çözümleri kaldırabildim.


1

Varsayılan iOS 8 davranışını kullanarak, durum çubuğunun gizlenmesini istediğimde görünmesi konusunda sorun yaşıyordum.

Bulduğum çözüm, doğrudan presentPopovergörünüm denetleyicimden aradıktan sonra yaptım:

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

Ayrıca bunu ana görünüm denetleyicime eklemek zorunda kaldım:

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

1

Bu problemi yaşadım ve tek bir delege fonksiyonu uygulayarak çözebildim. Durum çubuğumun arka planı siyah, bu yüzden uygulamam için UIStatusBarStyle .LightContent. Aygıt depolama alanından bir fotoğraf seçmek için UIImagePickerController sundu, durum çubuğu iyiydi. Ancak, "Film Rulosu" veya "Sık Kullanılanlar" gibi bir dizini tıklattığınızda, gezinme yığınını etkin bir şekilde zorlayan durum çubuğu kayboldu. Bir fotoğraf seçildiğinde hiçbir durum çubuğu yoktu; başka bir modsal görünüm denetleyicisini kapattıktan sonra, durum çubuğunun geri kalanının da siyah olabileceğini gösteren yalnızca pil vardı.

UIImagePickerController genişletme gibi diğer bazı çözümleri denedim, ancak Swift'te uzantıları kullanarak geçersiz kılamazsınız. Daha sonra UIImagePickerController alt sınıfını denemek ve viewWillAppear () üzerinde durum çubuğunu gizlemeye ve viewWillDisappear üzerinde durum çubuğunu göstermeye çalıştım. Durum çubuğunun bir .Slide animasyonu ile gizlendiğini görebildim, ancak durum çubuğu bir dizin seçildiğinde görünmez olduğundan, durum çubuğunun gösterilmediğini göremedim. Yine, yeşil pil, modal görüntü denetleyicisini kapattıktan sonra durum çubuğunun geri kalanıyla görünmez olarak geri geldi. Ayrıca prefersStatusBarHidden () geçersiz kılmayı denedim, ancak bu işlev asla çağrılmadı, bu yüzden sistem tarafından prefersStatusBarHidden () çağrıldığından emin olmak için setNeedsStatusBarAppearanceUpdate () öğesini çağırmayı denedim, ancak yine de çağrılmadı. Ayrıca, durum çubuğunu temsilci yönteminde gizlenecek şekilde ayarlama önerisi navigationController willShowViewController. Bir kez daha, tüm bunlar sorunu çözmeyen durum çubuğunu gizlemek. Anlaşıldığı gibi, UIImagePickerController'ın gezinme yığınına itildiğinde durum çubuğu stilinin değiştiği görülüyor. Sorunu tamamen çözmek için UIImagePickerController uzantıları veya alt sınıf yazmak zorunda kalmadım. Tek yapmanız gereken temsilciyi ayarlamak ve durum çubuğu stilini aynı kalacak şekilde ayarlamaktır. Bu ekleme sorunu hiç yaşamamış gibi yaptı. durum çubuğu stilinin UIImagePickerController'ın gezinme yığınına itildiğinde değiştiği görülüyor. Sorunu tamamen çözmek için UIImagePickerController uzantıları veya alt sınıf yazmak zorunda kalmadım. Tek yapmanız gereken temsilciyi ayarlamak ve durum çubuğu stilini aynı kalacak şekilde ayarlamaktır. Bu ekleme sorunu hiç yaşamamış gibi yaptı. durum çubuğu stilinin UIImagePickerController'ın gezinme yığınına itildiğinde değiştiği görülüyor. Sorunu tamamen çözmek için UIImagePickerController uzantıları veya alt sınıf yazmak zorunda kalmadım. Tek yapmanız gereken temsilciyi ayarlamak ve durum çubuğu stilini aynı kalacak şekilde ayarlamaktır. Bu ekleme sorunu hiç yaşamamış gibi yaptı.

let pickerController = UIImagePickerController()
pickerController.delegate = self

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
        UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: false)
    }

-1

Aslında, Görüntü Seçici'de durum çubuğu arka plan rengini ayarlamanın daha iyi bir yolunu buldum. Temel olarak, ImagePicker öğesinde varsayılan olarak beyaz bir Image olarak bir backgroundImage bulunduğundan, backgroundImage'ı navigationBar'dan nil'ye ayarlamanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.