UIImagePickerController स्थिति बार उपस्थिति को तोड़ता है


137

मेरी .plist फ़ाइल में, मेरे पास " नियंत्रक-आधारित स्थिति बार उपस्थिति " सेट करने के लिए है NO। लेकिन इसके बाद UIImagePickerController, मेरा ऐप ऐसा व्यवहार करता है मानो विकल्प सेट हो गया हो YES

मेरे ऐप में, मैं एक वीसी प्रस्तुत करता हूं जो एक प्रस्तुत करता है UIImagePickerController

समस्या इस तरह से होती है:

  • फोटो पिकर प्रस्तुत करने के बाद, जब कोई फोटो लाइब्रेरी चुना जाता है, तो स्टेटस बार टेक्स्ट का रंग बदल जाता है।
  • फिर एक बार, UIImagePickerControllerखारिज कर दिया जाता है, मेरे ऐप के बाकी हिस्सों के लिए स्टेटस बार रिक्ति बदल जाती है और स्टेटस बार के तहत अन्य नियंत्रकों के लिए सभी नेविगेशन बार प्रदर्शित होते हैं।

क्या मेरे विचार नियंत्रकों में स्थिति पट्टी को प्रबंधित किए बिना इसे हल करने का कोई तरीका है?


मेरे मामले में जवाब चाइल्डव्यूकंट्रोलर से जुड़ा था। मुझे उनका पुन: उपयोग करने के बजाय उन्हें फिर से बनाना था।
एलेक्स एल

7
यह वास्तव में एक iOS 7 बग की तरह लगता है, क्या किसी ने Apple के साथ रिपोर्ट दर्ज की है?
दान एफ

stackoverflow.com/questions/21225978/ साधारण समाधान के साथ इसी तरह का सवाल
टिंग वू

अरे @ एलेक्स, क्या आप जानते हैं कि ऐसा क्यों होता है?
शबरीनाथ पाब्बा

जवाबों:


192

ऊपर दिए गए किसी भी समाधान ने मेरे लिए काम नहीं किया, लेकिन रिचरीमैन और 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 के लिए मुझे कुछ मामलों में मिला, जिनमें आपको ALSO भी शामिल है 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
यह चाल है (जैसा कि एक रिच86मैन ने कहा): "चूंकि UIImagePickerController एक प्रकार का नेविगेशन नियंत्रक है, इसलिए आप खुद को UINavigationController प्रतिनिधि भी स्थापित कर रहे हैं।"
बेटो

2
UIImaegPicker को खारिज करने के बाद क्या होगा ..? मैंने सेट किया स्टेटसबार छिपा हुआ है तो यह काला होने वाला है।
नितिन गोहेल

क्या आपके पास ऊपर दिए गए प्रश्न के अनुसार प्लिस्ट स्थापित है?
dpjanes

UIImagePickerControllerSourceTypePhotoLibrary का उपयोग करते समय, कुछ एल्बम खोलने, और फिर वापस थोड़ा सा पैन करने और इशारे को रद्द करने पर क्या आपने इस मुद्दे पर ध्यान दिया?
कुकोस्क

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

यदि आपके पास .plist फ़ाइल में NO पर 'कंट्रोलर-आधारित स्थिति बार उपस्थिति' सेट है, तो स्वीकृत उत्तर काम करेगा। यदि वास्तव में आपको कुछ अन्य दृश्य नियंत्रकों में स्थिति पट्टी को नियंत्रित करने की आवश्यकता है और यह विकल्प हां में सेट किया गया है, तो 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

क्या आप यह कोशिश कर सकते हैं मुझे लगता है कि जरूरत हैStatusBarApperanceUpdate काम करेगा।

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 प्रस्तुत करता हूं। UIImagePickerController बर्खास्त करने के बाद स्थिति बार राज्य था:

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

समाधान जो मेरे लिए समस्या को ठीक कर रहा था वह स्थिति बहाल कर रहा था

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

उपरोक्त सभी उत्तर ठीक हैं और मदद कर सकते हैं।

मुझे एक ही समस्या थी कि विभिन्न आईओएस संस्करणों के तहत चलाए गए एप्लिकेशन को प्रबंधित करना ।

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]जब आपका प्रेजेंटेशन व्यू कंट्रोलर फिर से दिखाई दे?


यह शायद एक बग है - मैं एक उदाहरण परियोजना के साथ एक रडार दर्ज करूँगा और स्थिति पट्टी के प्रबंधन की पुरानी प्रणाली पर वापस गिर
जाऊंगा

1

मैं iOS7 में UIImagePickerController में स्थिति पट्टी को छिपाने की कोशिश करता हूं, लेकिन मुझे अभी भी नहीं पता कि यह कैसे करना है। मैं उपयोग करता हूं

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

ViewController में जो UIImagePickerController कहते हैं, और प्लिस्ट फ़ाइल में "नियंत्रक-आधारित स्थिति बार उपस्थिति = NO" सेट करें। उम्मीद है कि यह मदद कर सकता है।


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

यहां कुछ भी विशेष रूप से उस समस्या को ठीक नहीं करता है जिसमें मैं कर रहा था (और शायद ओपी भी चल रहा था), इसलिए मैंने सोचा कि मैं अपना उत्तर साझा करूंगा। इसके बजाय स्टेटस बार को छिपाने के लिए जो मुझे लगता है कि एक छोटी गाड़ी का घोल है (मैंने देखा कि यह कभी-कभी मेरे ऐप को ऐसी स्थिति में छोड़ देता है जहां स्टेटस बार छिपा होता है जब ऐसा नहीं होना चाहिए)। मैंने इसके बजाय प्रयास किया और इसके साथ अच्छा खेलना चाहा 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 में जोड़ें: "NO" मान के साथ नियंत्रक-आधारित स्थिति बार उपस्थिति देखें।

दूसरे चरण में: 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

डिफ़ॉल्ट आईओएस 8 व्यवहार का उपयोग करते हुए मुझे स्थिति पट्टी के साथ समस्या आ रही थी जब मैं इसे छिपाना चाहता था।

मुझे जो समाधान मिला, वह था, सीधे presentPopoverमेरे व्यू कंट्रोलर से फोन करने के बाद :

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

मुझे इसे अपने मुख्य दृश्य नियंत्रक में भी जोड़ना था:

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

1

इसलिए मुझे यह समस्या थी और मैं इसे केवल एक प्रतिनिधि समारोह को लागू करके हल करने में सक्षम था। मेरी स्थिति पट्टी की पृष्ठभूमि काली है, और इसलिए मेरे आवेदन के लिए UIStatusBarStyle है ।LightContent। जब मैंने डिवाइस संग्रहण से एक तस्वीर का चयन करने के लिए UIImagePickerController प्रस्तुत किया, तो स्थिति पट्टी ठीक थी। हालांकि, "कैमरा रोल" या "पसंदीदा" जैसी निर्देशिका में क्लिक करने पर, प्रभावी ढंग से नेविगेशन स्टैक पर धक्का, स्थिति पट्टी गायब हो गई। एक तस्वीर का चयन करने पर, कोई भी स्थिति पट्टी नहीं थी; एक और मोडल व्यू कंट्रोलर को खारिज करने पर, केवल बैटरी ही मौजूद थी, बाकी स्टेटस बार को इंगित करते हुए काला भी हो सकता है।

मैंने UIImagePickerController का विस्तार करने जैसे कुछ अन्य समाधानों की कोशिश की, लेकिन स्विफ्ट में, आप एक्सटेंशन का उपयोग करके ओवरराइड नहीं कर सकते। मैंने तब UIImagePickerController को उप-करने की कोशिश की और viewWillAppear () पर अपनी स्थिति पट्टी को छिपाने की कोशिश की और viewWillDisappear पर स्थिति बार को अनहाइड कर रहा है। मैं .Slide एनीमेशन के साथ स्टेटस बार को छिपाने में सक्षम था, लेकिन जब से किसी डायरेक्टरी को चुनने पर स्टेटस बार अदृश्य हो जाता है, मैं स्टेटस बार को अनहाइड नहीं देख पा रहा था। फिर, हरे रंग की बैटरी मोडल व्यू कंट्रोलर को खारिज करने पर अदृश्य स्थिति के बाकी हिस्सों के साथ वापस आ गई। मैंने प्रीफरस्टैटसबर्हिड () को ओवरराइड करने का भी प्रयास किया, लेकिन उस फ़ंक्शन को कभी भी कॉल नहीं किया गया था, इसलिए मैंने सिस्टम द्वारा कॉल किए जाने वाले प्रीफ़रस्टैटसबर्हाइड () को सुनिश्चित करने के लिए सेटनएड्सस्टैटबर्बरसुरेन्सयूपडेट () को कॉल करने की कोशिश की, लेकिन यह अभी भी नहीं कहा जाता है। इसके अलावा, वहाँ प्रतिनिधि पट्टी विधि नेविगेशनController willShowViewController पर छिपा होने की स्थिति निर्धारित करने का सुझाव है। एक बार फिर, यह सब करता है स्थिति पट्टी को छिपाता है, जो समस्या को हल नहीं करता है। जैसा कि यह पता चला है, ऐसा लगता है कि UIImagePickerController के नेविगेशन स्टैक को धक्का देने पर स्टेटस बार शैली बदल जाती है। समस्या को पूरी तरह से हल करने के लिए, मुझे एक्सटेंशन या उपकथा UIImagePickerController नहीं लिखना था। आपको बस इतना करना है कि प्रतिनिधि को सेट करें और उसी रहने के लिए स्टेटस बार स्टाइल सेट करें। इस जोड़ ने इसे ऐसा बना दिया मानो समस्या कभी मौजूद ही नहीं थी। ऐसा लगता है कि UIImagePickerController के नेविगेशन स्टैक को पुश करने पर स्टेटस बार स्टाइल बदल जाता है। समस्या को पूरी तरह से हल करने के लिए, मुझे एक्सटेंशन या उपकथा UIImagePickerController नहीं लिखना था। आपको बस इतना करना है कि प्रतिनिधि को सेट करें और उसी रहने के लिए स्टेटस बार स्टाइल सेट करें। इस जोड़ ने इसे ऐसा बना दिया मानो समस्या कभी मौजूद ही नहीं थी। ऐसा लगता है कि UIImagePickerController के नेविगेशन स्टैक को पुश करने पर स्टेटस बार स्टाइल बदल जाता है। समस्या को पूरी तरह से हल करने के लिए, मुझे एक्सटेंशन या उपकथा UIImagePickerController नहीं लिखना था। आपको बस इतना करना है कि प्रतिनिधि को सेट करें और उसी रहने के लिए स्टेटस बार स्टाइल सेट करें। इस जोड़ ने इसे ऐसा बना दिया मानो समस्या कभी मौजूद ही नहीं थी।

let pickerController = UIImagePickerController()
pickerController.delegate = self

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

-1

मुझे वास्तव में इमेज पिकर में स्टेटस बार बैकग्राउंड कलर सेट करने का एक बेहतर तरीका मिला। मूल रूप से आपको बैकग्राउंडइमेज को नेविगेशनबार से एनआईएल पर सेट करने की आवश्यकता है, क्योंकि डिफ़ॉल्ट रूप से इमेज पिकर में एक बैकग्राउंडइमेज एक सफेद छवि के रूप में है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.