UIImagePickerControll phá vỡ sự xuất hiện của thanh trạng thái


137

Trong tệp .plist của tôi, tôi có " Xem giao diện thanh trạng thái dựa trên bộ điều khiển " được đặt thành NO. Nhưng sau đó UIImagePickerController, ứng dụng của tôi hoạt động như thể tùy chọn được đặt thành YES.

Trong ứng dụng của tôi, tôi trình bày một VC trình bày a UIImagePickerController.

Vấn đề xảy ra như thế này:

  • Sau khi trình chọn ảnh được trình bày, khi thư viện ảnh được chọn, màu của văn bản trên thanh trạng thái sẽ thay đổi.
  • Sau đó, một lần, UIImagePickerControllerbị loại bỏ, khoảng cách thanh trạng thái thay đổi cho phần còn lại của ứng dụng của tôi và tất cả thanh điều hướng cho các bộ điều khiển khác hiển thị dưới thanh trạng thái.

Có cách nào để giải quyết vấn đề này mà không cần quản lý thanh trạng thái trong bộ điều khiển xem của tôi không?


Câu trả lời trong trường hợp của tôi được gắn với người điều khiển trẻ em. Tôi đã phải tạo lại chúng thay vì sử dụng lại chúng.
Alex L

7
Đây thực sự giống như một lỗi iOS 7, đã có ai nộp báo cáo với Apple chưa?
Dan F

stackoverflow.com/questions/21225978/ câu hỏi tương tự với giải pháp đơn giản
Ting Wu

Này @AlexL, bạn có biết tại sao nó xảy ra không?
Shabarinath Pabba

Câu trả lời:


192

Không có giải pháp nào ở trên phù hợp với tôi, nhưng bằng cách kết hợp câu trả lời của Rich86man và iOS_DEV_09, tôi đã có một giải pháp hoạt động ổn định:

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

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

Về giải pháp tuyệt vời này. Trong 2014 / iOS8 tôi đã tìm thấy trong một số trường hợp bạn C ALNG bao gồm prefersStatusBarHiddenvà có thể, childViewControllerForStatusBarHiddenvì vậy ...

-(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...

Hy vọng nó sẽ giúp được ai đó


3
Đây là mẹo (như Rich86man đã nói): "Vì UIImagePickerContoder là một loại trình điều khiển Điều hướng, nên bạn cũng tự đặt mình là đại biểu của UINavestionControll."
Beto

2
Thế còn sau khi sa thải UIImaegPicker ..? Tôi đặt thanh trạng thái ẩn sai thì nền sẽ chuyển sang màu đen.
Nitin Gohel

Bạn có thiết lập nguyên bản theo câu hỏi trên không?
dpjanes

Bạn có nhận thấy vấn đề khi sử dụng UIImagePickerControllSourceTypePhotoL Library, mở một số album và sau đó quay lại một chút và hủy bỏ cử chỉ không?
Kukosk

3
Điều này hoạt động, mặc dù thanh trạng thái bật vào và ra một cách rất giật. Tôi đã gửi một lỗi với Apple.
jjxtra

84

Tôi đã đối mặt với vấn đề tương tự ngày hôm nay. Đây là giải pháp của tôi.

Trong trình điều khiển chế độ xem người gọi bộ chọn hình ảnh, hãy đặt mình làm đại biểu của Bộ chọn hình ảnh. (Có lẽ bạn đã làm điều này)

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

Vì UIImagePickerContoder là một loại trình điều khiển Điều hướng, nên bạn cũng tự đặt mình làm đại biểu UINavestionControll. Sau đó :

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

Thay thế UIStatusBarStyleLightContent bằng bất kỳ phong cách nào bạn đang tìm kiếm.


10

Câu trả lời được chấp nhận sẽ hoạt động nếu bạn có 'Giao diện thanh trạng thái dựa trên bộ điều khiển' được đặt thành NO trong tệp .plist của bạn. Nếu thực sự bạn cần điều khiển thanh trạng thái trong một số bộ điều khiển chế độ xem khác và đặt tùy chọn này thành CÓ, thì cách khác để khiến UIImagePickerContoder hoạt động chính xác là bằng cách phân lớp nó

// .h
@interface MYImagePickerController : UIImagePickerController
@end

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

6

tôi đã đối mặt với cùng một vấn đề

đây là giải pháp của tôi đặt cái này trong viewWillAppear của trình điều khiển khung nhìn mà bạn đang mở pickerview

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

[[UIApplication sharedApplication] setStatusBarHidden:YES];

}

4

Bạn có thể thử cái này không Tôi nghĩ nhu cầuStatusBarApperanceUpdate sẽ hoạt động.

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

4

Tôi thấy điều này để cung cấp xử lý thích hợp, có hai phần.

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

Bản thân UIImagePickerContoder trình bày các bộ điều khiển xem, do đó, ủy nhiệm này hoạt động cho tất cả các trình bày trên ngăn xếp.

viewWillAppear đảm bảo chính bộ điều khiển khung nhìn này luôn được đặt lại bất cứ khi nào bộ điều khiển khung nhìn trình bày bỏ qua nó.


3

Tôi đã từng gặp vấn đề tương tự. Thêm vào thông tin: "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" với giá trị "KHÔNG"

Ví dụ ở đây https://stackoverflow.com/a/19211669

Giải pháp này hiệu quả với tôi.


2

Đây có lẽ là một lỗi. Tôi đã giải quyết vấn đề bằng cách đặt "Giao diện thanh trạng thái dựa trên bộ điều khiển" được đặt thành CÓ và trong mọi trình điều khiển chế độ xem dán theo mã sau:

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

Sau đó, ứng dụng của tôi hoạt động như mong đợi.


2

Để ẩn thanh trạng thái trong UIImagePicker:

-

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

và khi UIImagePicker bị loại bỏ để ẩn thanh trạng thái trong Trình điều khiển xem, hãy sử dụng mã sau:

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

    [[UIApplication sharedApplication] setStatusBarHidden:YES];

}

2

thử cái này ....

điều này sẽ hoạt động trong cả hai trường hợp, tức là cho dù bạn sử dụng PresentModalViewControll và PushViewControll

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

phương pháp đại biểu

-(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

Tất cả những điều trên không làm việc cho tôi. Tôi đã giải quyết vấn đề bằng cách thay đổi phong cách trình bày thành:

imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;

2

Không có giải pháp nào ở trên làm việc cho tôi.

Tôi trình bày UIImagePickerContoder dưới dạng bộ điều khiển chế độ xem. Sau khi loại bỏ UIImagePickerControll, trạng thái thanh trạng thái là:

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

Giải pháp khắc phục sự cố cho tôi là khôi phục trạng tháiBarOrientation sau khi loại bỏ UIImagePickerContoder:

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

...

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

2

Mã này đã giúp tôi tùy chỉnh phong cách thanh trạng thái.

EDIT: giải pháp này hoạt động nếu "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" == CÓ

@implementation UIImagePickerController (IOS7_StatusBarStyle)

-(UIViewController*)childViewControllerForStatusBarStyle
{
   return nil;
}

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

@end

2

Tất cả các câu trả lời ở trên là ok và có thể giúp đỡ.

Tôi gặp vấn đề tương tự khi phải quản lý ứng dụng chạy dưới các phiên bản iOS khác nhau .

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

Sau đó, trong đại biểu:

- (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

Một giải pháp khác có thể hoạt động trong một số tình huống.

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

1

Bạn đã thử gọi [self setNeedsStatusBarAppearanceUpdate]khi trình điều khiển xem trình bày của bạn xuất hiện lại?


Sau đó, đây có thể là một lỗi - Tôi đã gửi một radar với một dự án ví dụ và quay lại hệ thống quản lý thanh trạng thái cũ :(
Ash Furrow

1

Tôi cố gắng ẩn thanh trạng thái trong UIImagePickerControll trong iOS7, nhưng tôi vẫn không biết làm thế nào để làm điều này. tôi sử dụng

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

trong ViewContoder gọi UIImagePickerContoder và đặt "Xem thanh trạng thái dựa trên bộ điều khiển xuất hiện = NO" trong tệp plist. Hy vọng điều này có thể giúp đỡ.


1

thử cái này :

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

và trong giao thức thực hiện, sử dụng điều này:

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

1

Điều này đã giải quyết nó cho tôi ...:

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

1

Không có gì ở đây đặc biệt khắc phục vấn đề mà tôi đang gặp phải (và có lẽ OP cũng gặp phải), vì vậy tôi nghĩ rằng tôi sẽ chia sẻ câu trả lời của mình. Thay vì ẩn thanh trạng thái mà tôi nghĩ là một giải pháp lỗi (tôi nhận thấy rằng đôi khi nó sẽ khiến ứng dụng của tôi ở trạng thái mà thanh trạng thái bị ẩn khi không nên sử dụng). Thay vào đó tôi đã chọn để thử và chơi tốt với UIStatusBarStyles.

Khi UIImagePickerControll trình bày quan điểm của nó, tôi đặt kiểu thanh trạng thái thành mặc định vì màu nền mặc định là màu xám nhạt.

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

Sau đó, khi bộ chọn hình ảnh bị loại bỏ, tôi đặt nó trở lại 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

Trong trường hợp này, chúng tôi đang sử dụng 2 bước

Trong bước đầu tiên: Thêm vào info.plist: "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" với giá trị "NO"

Trong bước thứ hai: Sử dụng / gọi mã này với đại biểu của UIImagePickerControll

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

Trong trường hợp IOS-7 thêm một chức năng nữa

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

1

Kể từ iOS 8.1, có vẻ như cuối cùng họ đã sửa lỗi này! Tôi đã có thể xóa tất cả các cách giải quyết mà tôi sử dụng khỏi mã của mình.


1

Sử dụng hành vi mặc định của iOS 8, tôi gặp vấn đề với thanh trạng thái xuất hiện khi tôi muốn ẩn nó.

Giải pháp tôi tìm thấy là, ngay sau khi gọi presentPopovertừ bộ điều khiển xem của tôi, tôi đã làm:

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

Tôi cũng đã phải thêm cái này vào bộ điều khiển khung nhìn chính của mình:

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

1

Vì vậy, tôi đã có vấn đề này và tôi đã có thể giải quyết nó bằng cách thực hiện một chức năng ủy nhiệm duy nhất. Nền của thanh trạng thái của tôi là màu đen và vì vậy UIStatusBarStyle cho ứng dụng của tôi là .LightContent. Khi tôi trình bày UIImagePickerControll để chọn ảnh từ bộ lưu trữ thiết bị, thanh trạng thái vẫn ổn. Tuy nhiên, khi nhấp vào thư mục như "Camera Roll" hoặc "Favorites", đẩy hiệu quả vào ngăn xếp điều hướng, thanh trạng thái biến mất. Khi chọn một bức ảnh, không có thanh trạng thái nào cả; khi loại bỏ một bộ điều khiển chế độ xem khác, chỉ có pin, cho biết phần còn lại của thanh trạng thái cũng có thể có màu đen.

Tôi đã thử một số giải pháp khác như mở rộng UIImagePickerControll, nhưng trong Swift, bạn không thể ghi đè bằng tiện ích mở rộng. Sau đó, tôi đã cố gắng phân lớp UIImagePickerControll và cố gắng ẩn thanh trạng thái của nó trên viewWillAppear () và bỏ ẩn thanh trạng thái trên viewWillDisappear. Tôi đã có thể thấy thanh trạng thái ẩn với hình động .Slide, nhưng vì thanh trạng thái là vô hình khi chọn thư mục, tôi không thể nhìn thấy thanh trạng thái bỏ ẩn. Một lần nữa, pin xanh trở lại với phần còn lại của thanh trạng thái vô hình khi loại bỏ bộ điều khiển chế độ xem phương thức. Tôi cũng đã thử ghi đè pre preferStatusBarHidden (), nhưng chức năng đó không bao giờ được gọi, vì vậy tôi đã thử gọi setNeedStatusBarAppparentUpdate () để đảm bảo rằng prelikeStatusBarHidden () được gọi bởi hệ thống, nhưng nó vẫn không được gọi. Cũng thế, có một gợi ý là đặt thanh trạng thái bị ẩn trên phương thức ủy nhiệm navigationContoder willShowViewControll. Một lần nữa, tất cả điều này là ẩn thanh trạng thái, không giải quyết vấn đề. Khi nó bật ra, có vẻ như kiểu thanh trạng thái được thay đổi khi đẩy lên ngăn điều hướng của UIImagePickerCont kiểm soát. Để giải quyết vấn đề hoàn toàn, tôi không phải viết các phần mở rộng hoặc lớp con UIImagePickerControll. Tất cả những gì bạn cần làm là đặt đại biểu và đặt kiểu thanh trạng thái giữ nguyên. Sự bổ sung này làm cho nó như thể vấn đề không bao giờ tồn tại. có vẻ như kiểu thanh trạng thái được thay đổi khi đẩy lên ngăn xếp điều hướng của UIImagePickerControll. Để giải quyết vấn đề hoàn toàn, tôi không phải viết các phần mở rộng hoặc lớp con UIImagePickerControll. Tất cả những gì bạn cần làm là đặt đại biểu và đặt kiểu thanh trạng thái giữ nguyên. Sự bổ sung này làm cho nó như thể vấn đề không bao giờ tồn tại. có vẻ như kiểu thanh trạng thái được thay đổi khi đẩy lên ngăn xếp điều hướng của UIImagePickerControll. Để giải quyết vấn đề hoàn toàn, tôi không phải viết các phần mở rộng hoặc lớp con UIImagePickerControll. Tất cả những gì bạn cần làm là đặt đại biểu và đặt kiểu thanh trạng thái giữ nguyên. Sự bổ sung này làm cho nó như thể vấn đề không bao giờ tồn tại.

let pickerController = UIImagePickerController()
pickerController.delegate = self

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

-1

Tôi thực sự tìm thấy một cách tốt hơn để đặt màu nền của thanh trạng thái trong Bộ chọn hình ảnh. Về cơ bản, bạn cần đặt backgroundImage từ navigationBar thành nil, vì mặc định trong Image Picker có một BackgroundImage là một Image trắng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.