UIImagePickerController แบ่งลักษณะแถบสถานะ


137

ในแฟ้ม .plist ของฉันฉันมี " ดูตัวควบคุมตามแถบสถานะลักษณะ " NOตั้ง แต่หลังจากที่UIImagePickerControllerพฤติกรรม app YESของฉันราวกับว่าตัวเลือกที่มีการตั้งค่า

ใน app ของฉันฉันนำเสนอ VC UIImagePickerControllerว่าของขวัญ

ปัญหาเกิดขึ้นเช่นนี้

  • หลังจากแสดงตัวเลือกภาพถ่ายเมื่อเลือกไลบรารีรูปภาพแล้วสีของข้อความในแถบสถานะจะเปลี่ยนไป
  • จากนั้นเมื่อUIImagePickerControllerถูกไล่ออกแถบสถานะจะเปลี่ยนระยะห่างสำหรับแอพที่เหลือของฉันและแถบการนำทางทั้งหมดสำหรับตัวควบคุมอื่น ๆ จะปรากฏขึ้นภายใต้แถบสถานะ

มีวิธีการแก้ปัญหานี้โดยไม่จัดการแถบสถานะในตัวควบคุมมุมมองของฉันหรือไม่?


คำตอบในกรณีของฉันถูกผูกไว้กับ childviewcontrollers ฉันต้องสร้างพวกเขาใหม่แทนที่จะนำพวกเขากลับมาใช้ใหม่
Alex L

7
ดูเหมือนว่านี่จะเป็นข้อบกพร่องของ iOS 7 มีใครส่งรายงานกับ Apple บ้างไหม
Dan F

stackoverflow.com/questions/21225978/…คำถามที่คล้ายกันกับวิธีแก้ปัญหาอย่างง่าย
Ting Wu

เฮ้ @AlexL คุณรู้ไหมว่าทำไมมันถึงเกิดขึ้น?
Shabarinath Pabba

คำตอบ:


192

วิธีการแก้ปัญหาด้านบนไม่ได้ผลสำหรับฉัน แต่ด้วยการรวมคำตอบของ Rich86man และ iOS_DEV_09 ฉันมีโซลูชันที่ใช้งานได้อย่างต่อเนื่อง:

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

และ

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

เกี่ยวกับโซลูชันที่ยอดเยี่ยมนี้ สำหรับ 2014 / iOS8 ฉันพบในบางกรณีคุณจำเป็นต้องรวมถึงprefersStatusBarHiddenและอาจ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...

หวังว่ามันจะช่วยให้ใครบางคน


3
นี่เป็นเคล็ดลับ (ตามที่ Rich86man กล่าว): "เนื่องจาก UIImagePickerController เป็นตัวควบคุมการนำทางคุณจึงตั้งค่าตัวคุณเองในฐานะตัวแทนของ UINavigationController"
Beto

2
แล้วหลังจากเลิก UIImaegPicker .. ฉันตั้งค่าแถบสถานะซ่อนเท็จจากนั้นพื้นหลังจะเป็นสีดำ
Nitin Gohel

คุณมีการตั้งค่า plist ตามคำถามข้างต้นหรือไม่
dpjanes

คุณสังเกตเห็นปัญหาเมื่อใช้ UIImagePickerControllerSourceTypePhotoLibrary เปิดอัลบั้มขึ้นมาแล้วเลื่อนปรากฎเล็กน้อยแล้วยกเลิกท่าทาง
Kukosk

3
วิธีนี้ใช้ได้ผลแม้ว่าแถบสถานะจะปรากฏขึ้นและออกในลักษณะที่กระตุกมาก ฉันได้ยื่นข้อบกพร่องกับ Apple แล้ว
jjxtra

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 ด้วยสไตล์ที่คุณกำลังมองหา


10

คำตอบที่ยอมรับจะใช้งานได้หากคุณตั้งค่า 'ลักษณะที่ปรากฏบนแถบสถานะของคอนโทรลเลอร์' เป็น NO ในไฟล์. plist ของคุณ หากคุณต้องการควบคุมแถบสถานะในตัวควบคุมมุมมองอื่น ๆ และตั้งค่าตัวเลือกนี้เป็น YES วิธีอื่นในการทำให้ UIImagePickerController

// .h
@interface MYImagePickerController : UIImagePickerController
@end

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

6

ฉันประสบปัญหาเดียวกัน

นี่คือทางออกของฉัน วางสิ่งนี้ลงใน viewWillAppear ของตัวควบคุมมุมมองที่คุณกำลังเปิดตัวเลือกรูปภาพ

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

[[UIApplication sharedApplication] setStatusBarHidden:YES];

}

4

คุณลองสิ่งนี้ได้ไหม ฉันคิดว่า needsStatusBarApperanceUpdate จะใช้งานได้

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

4

ฉันพบสิ่งนี้เพื่อให้การจัดการที่เหมาะสมมีสองส่วน

- (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 ทำให้แน่ใจว่าตัวควบคุมมุมมองนี้ถูกรีเซ็ตเสมอเมื่อใดก็ตามที่ตัวควบคุมมุมมองการนำเสนอเลิกใช้งานด้านบน


3

ผมมีปัญหาเหมือนกัน. เพิ่มรายละเอียด: "ดูลักษณะแถบสถานะตามคอนโทรลเลอร์" พร้อมค่า "ไม่"

ตัวอย่างที่นี่ https://stackoverflow.com/a/19211669

วิธีนี้ใช้ได้ผลสำหรับฉัน


2

นี่อาจเป็นข้อผิดพลาด ฉันแก้ไขปัญหาโดยการตั้งค่า "ดูการปรากฏตัวของแถบสถานะตามตัวควบคุม" ตั้งค่าเป็น YES และในทุกมุมมองคอนโทรลเลอร์วางในรหัสต่อไปนี้:

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

จากนั้นแอพของฉันจะทำงานตามที่คาดไว้


2

สำหรับการซ่อนแถบสถานะใน UIImagePicker:

-

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

และเมื่อ UIImagePicker ถูกไล่ออกเพื่อซ่อนแถบสถานะในมุมมองควบคุมใช้รหัสต่อไปนี้:

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

    [[UIApplication sharedApplication] setStatusBarHidden:YES];

}

2

ลองสิ่งนี้ ....

สิ่งนี้จะทำงานในทั้งสองกรณีคือว่าคุณใช้ presentModalViewController และ pushViewController

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

วิธีการมอบหมาย

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

ทั้งหมดข้างต้นไม่ได้ผลสำหรับฉัน ฉันแก้ไขปัญหาโดยเปลี่ยนรูปแบบการนำเสนอเป็น:

imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;

2

วิธีการแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน

ฉันนำเสนอ UIImagePickerController เป็นตัวควบคุมมุมมอง modal หลังจากยกเลิก UIImagePickerController สถานะของแถบสถานะคือ:

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

วิธีแก้ไขปัญหาสำหรับฉันคือการคืนค่าสถานะ BarOrientation หลังจากยกเลิก UIImagePickerController:

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

...

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

2

รหัสนี้ช่วยให้ฉันปรับแต่งสไตล์แถบสถานะ

แก้ไข: โซลูชันนี้จะทำงานถ้า "ดูลักษณะแถบสถานะที่ใช้ควบคุม" == ใช่

@implementation UIImagePickerController (IOS7_StatusBarStyle)

-(UIViewController*)childViewControllerForStatusBarStyle
{
   return nil;
}

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

@end

2

คำตอบทั้งหมดข้างต้นนั้นใช้ได้และสามารถช่วยได้

ฉันมีปัญหาเดียวกันต้องจัดการแอพลิเคชัน runned ภายใต้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];
}

2

อีกวิธีหนึ่งที่อาจใช้งานได้ในบางสถานการณ์

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

1

คุณลองโทรแล้ว[self setNeedsStatusBarAppearanceUpdate]เมื่อตัวควบคุมมุมมองการนำเสนอของคุณปรากฏขึ้นอีกครั้ง?


อาจเป็นข้อผิดพลาด - ฉันจะส่งเรดาร์พร้อมตัวอย่างโครงการและถอยกลับไปใช้ระบบเก่าของการจัดการแถบสถานะ :(
Ash Furrow

1

ฉันพยายามซ่อนแถบสถานะใน UIImagePickerController ใน iOS7 แต่ฉันยังไม่รู้วิธีการทำเช่นนี้ ฉันใช้

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

ใน ViewController ที่เรียก UIImagePickerController และตั้งค่า "ดูแถบสถานะที่ใช้ตัวควบคุมปรากฏ = NO" ในไฟล์ plist หวังว่านี่จะช่วยได้


1

ลองนี้:

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

และในการใช้โปรโตคอลให้ใช้สิ่งนี้:

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

1

วิธีนี้แก้ไขได้สำหรับฉัน ... :

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

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

1

ในกรณีนี้เราใช้ 2 ขั้นตอน

ในขั้นตอนแรก: เพิ่มใน info.plist: "ดูลักษณะแถบสถานะตามตัวควบคุม" ด้วยค่า "ไม่"

ในขั้นตอนที่สอง: ใช้ / เรียกรหัสนี้ด้วยผู้รับมอบสิทธิ์ของ UIImagePickerController

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

ในกรณีที่ IOS-7 เพิ่มฟังก์ชั่นอีกหนึ่งตัว

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

1

ในฐานะของ iOS 8.1 ดูเหมือนว่าพวกเขาจะแก้ไขข้อบกพร่องนี้ในที่สุด! ฉันสามารถลบวิธีแก้ไขทั้งหมดที่ใช้จากรหัสของฉันได้


1

การใช้พฤติกรรมเริ่มต้นของ iOS 8 ฉันมีปัญหากับแถบสถานะปรากฏขึ้นเมื่อฉันต้องการให้มันซ่อนอยู่

วิธีแก้ปัญหาที่ฉันพบคือหลังจากโทรpresentPopoverจากตัวควบคุมมุมมองของฉันฉันได้:

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

ฉันยังต้องเพิ่มสิ่งนี้ไปยังตัวควบคุมมุมมองหลักของฉัน:

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

1

ดังนั้นฉันมีปัญหานี้และฉันก็สามารถที่จะแก้ปัญหาได้โดยเพียงแค่ใช้ฟังก์ชั่นผู้ได้รับมอบหมายเพียงครั้งเดียว พื้นหลังของแถบสถานะของฉันเป็นสีดำดังนั้น UIStatusBarStyle สำหรับแอปพลิเคชันของฉันคือ. LIGHTContent เมื่อฉันแสดง UIImagePickerController ให้เลือกภาพถ่ายจากที่เก็บข้อมูลอุปกรณ์แถบสถานะก็ใช้ได้ อย่างไรก็ตามเมื่อคลิกเข้าไปในไดเรกทอรีเช่น "ม้วนฟิล์ม" หรือ "รายการโปรด" ได้อย่างมีประสิทธิภาพเมื่อกดลงบนสแต็กการนำทางแถบสถานะจะหายไป เมื่อเลือกภาพถ่ายไม่มีแถบสถานะเลย เมื่อยกเลิกการควบคุมตัวควบคุม modal view อื่นมีเพียงแบตเตอรี่เท่านั้นที่แสดงว่าแถบสถานะที่เหลืออาจเป็นสีดำเช่นกัน

ฉันลองแก้ไขปัญหาอื่น ๆ เช่นการขยาย UIImagePickerController แต่ใน Swift คุณไม่สามารถแทนที่ด้วยส่วนขยายได้ ฉันพยายาม subclass UIImagePickerController และพยายามซ่อนแถบสถานะใน viewWillAppear () และซ่อนแถบสถานะใน viewWillDisappear ฉันสามารถเห็นแถบสถานะซ่อนด้วยภาพเคลื่อนไหว. สไลด์ แต่เนื่องจากแถบสถานะไม่ปรากฏเมื่อเลือกไดเรกทอรีฉันจึงไม่สามารถเห็นแถบสถานะถูกซ่อน อีกครั้งแบตเตอรี่สีเขียวกลับมาพร้อมกับแถบสถานะอื่น ๆ ที่มองไม่เห็นเมื่อเลิกใช้งานตัวควบคุมมุมมองกิริยา ฉันยังพยายามแทนที่ prefersStatusBarHidden () แต่ไม่เคยเรียกใช้ฟังก์ชั่นนั้นดังนั้นฉันจึงลองเรียกใช้ setNeedsStatusBarAppearanceUpdate () เพื่อให้มั่นใจว่าระบบ prefersStatusBarHidden () นั้นยังไม่ถูกเรียกใช้ นอกจากนี้ มีข้อเสนอแนะในการตั้งค่าแถบสถานะที่จะซ่อนอยู่ในวิธีการมอบสิทธิ์ navigationController willShowViewController ทั้งหมดนี้จะซ่อนแถบสถานะซึ่งไม่สามารถแก้ปัญหาได้ ตามที่ปรากฏออกมาดูเหมือนว่าสไตล์แถบสถานะจะเปลี่ยนไปเมื่อกดลงบนสแต็กการนำทางของ UIImagePickerController เพื่อแก้ปัญหาทั้งหมดฉันไม่ต้องเขียนส่วนขยายหรือ subclass UIImagePickerController สิ่งที่คุณต้องทำคือตั้งค่าตัวแทนและตั้งค่าสไตล์แถบสถานะให้คงเดิม การเพิ่มนี้ทำให้ราวกับว่าปัญหาไม่เคยมีอยู่ ดูเหมือนว่าสไตล์แถบสถานะจะเปลี่ยนไปเมื่อกดไปที่สแต็กการนำทางของ UIImagePickerController เพื่อแก้ปัญหาทั้งหมดฉันไม่ต้องเขียนส่วนขยายหรือ subclass UIImagePickerController สิ่งที่คุณต้องทำคือตั้งค่าตัวแทนและตั้งค่าสไตล์แถบสถานะให้คงเดิม การเพิ่มนี้ทำให้ราวกับว่าปัญหาไม่เคยมีอยู่ ดูเหมือนว่าสไตล์แถบสถานะจะเปลี่ยนไปเมื่อกดไปที่สแต็กการนำทางของ UIImagePickerController เพื่อแก้ปัญหาทั้งหมดฉันไม่ต้องเขียนส่วนขยายหรือ subclass UIImagePickerController สิ่งที่คุณต้องทำคือตั้งค่าตัวแทนและตั้งค่าสไตล์แถบสถานะให้คงเดิม การเพิ่มนี้ทำให้ราวกับว่าปัญหาไม่เคยมีอยู่

let pickerController = UIImagePickerController()
pickerController.delegate = self

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

-1

ฉันพบวิธีที่ดีกว่าในการตั้งค่าสีพื้นหลังของแถบสถานะในเครื่องมือเลือกรูปภาพ โดยทั่วไปคุณต้องตั้งค่า backgroundImage จาก navigationBar เป็นศูนย์เนื่องจากค่าเริ่มต้นใน Image Picker มี backgroundImage เป็นรูปภาพสีขาว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.