2017-04-20 7 views
5

मेरा एप्लिकेशन जो पोर्ट्रेट और लैंडस्केप ओरिएंटेशन दोनों का समर्थन करता है। मैं एक UITabBarController में स्थित निम्नलिखित कोड का उपयोग कर एक UIViewController से रीति से एक UIViewController पेश कर रहा हूँ:UIViewController लैंडस्केप मोड में प्रस्तुत किए जाने पर ठीक से नहीं दिख रहा है

self.modalViewController = [[ModalViewController alloc] init]; 

[self presentViewController:self.modalViewController animated:YES completion:^{ 

}]; 

ModalViewController एक नियंत्रक कि केवल लैंडस्केप में उपयोगकर्ता द्वारा देखा जाना चाहिए है। यह लैंडस्केप लाइट के लिए लैंडस्केप राइट फॉर्म को घुमाने में सक्षम होना चाहिए। इस तरह यह दिखता है:

@implementation ModalViewController 

#pragma mark - UIViewController - Orientation 

- (UIInterfaceOrientationMask)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

#pragma mark - NSObject 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor greenColor]; 
} 

#pragma mark - UIViewController - Status Bar 

- (BOOL)prefersStatusBarHidden 
{ 
    return YES; 
} 

@end 

नियंत्रक बाईं ओर से स्लाइड करता है और स्क्रीन को पूरी तरह से 95% कवर करता है। लेकिन 5% समय, यह नीचे से स्लाइड करता है और स्क्रीन के केवल आधा भाग को कवर करता है।

यहाँ यह कैसे लग रहा है जब यह ठीक काम कर रहा है:

enter image description here

और यहाँ है कि यह कैसे दिखता है, जब यह ठीक से काम नहीं कर रहा है:

enter image description here

मैं एक नमूना परियोजना है कि ऐसा कर सकते यहां पाए जाएं: https://github.com/TitouanVanBelle/Bug

उसके लिए यूआई परीक्षण लक्ष्य है एलपी इस मुद्दे को पुन: पेश करता है लेकिन यह शायद ही कभी काम करता है।

क्या किसी को पता है कि यह क्यों हो रहा है?

+1

इसे पोस्ट करने के लिए धन्यवाद, समाधान – sage444

उत्तर

0

आपका आवेदन पोर्ट्रेट, लैंडस्केप बाएं और लैंडस्केप दाएं ओरिएंटेशन का समर्थन कर रहा है।

ModalViewController.m अद्यतन में विधि निम्नलिखित -

- (UIInterfaceOrientationMask)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape|UIInterfaceOrientationMaskPortrait; 
} 

आपका मॉडल दृष्टि नियंत्रक केवल समर्थन कर रहा है लैंडस्केप ओरिएंटेशन इसलिए इस मुद्दे।

UIInterfaceOrientationMaskLandscape के बजाय | UIInterfaceOrientationMaskPortrait आप के रूप में अच्छी UIInterfaceOrientationMaskAllButUpsideDown उपयोग कर सकते हैं।

संपादित करें 1

आपकी आवश्यकता आप ModalViewController.m में निम्नलिखित कोड अपडेट करके घुमाने वर्तमान अभिविन्यास मजबूर कर सकते हैं के अनुसार।

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor greenColor]; 

    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft]; 
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 
} 
+0

के लिए भी मांग कर रहा है लेकिन फिर उपयोगकर्ता लैंडस्केप में और पोर्ट्रेट में मॉडल व्यू कंट्रोलर दिखाने में सक्षम होंगे और मुझे यह नहीं चाहिए। मैं केवल उन्हें लैंडस्केप मोड –

+0

अहह में देखना चाहता हूं .. जो आपके प्रश्न से स्पष्ट नहीं था। मुझे कुछ समय दें मैं अपना उत्तर –

+0

ठीक कर दूंगा। सवाल संपादित करेंगे। –

0

यह एक टिप्पणी होनी चाहिए, लेकिन मेरे पास पर्याप्त प्रतिष्ठा नहीं है, इसलिए इसका उत्तर दें।

मुझे लगता है कि मैंने इसी तरह की त्रुटि देखी है।

समस्या का कारण यह हो सकता है कि संक्रमण के दौरान अभिविन्यास परिवर्तन इस तरह से होता है कि जब देखते हैं कि डिडलोड को अभी भी पोर्ट्रेट किया गया था, लेकिन फिर परिदृश्य में बदल गया और उचित श्रोता सही ढंग से प्रतिक्रिया करने में विफल रहा (शायद क्योंकि एनीमेशन स्थिति संक्रमण " चालू"?)।

इसे ठीक करने पर कुछ विचार:

  • उन्मुखीकरण परिवर्तन सूचनाओं को सुनने और स्पष्ट रूप से self.view.setNeedsLayout फोन जब वर्तमान उन्मुखीकरण अवास्तविक लौटाते autorotate चाहिए अगर वर्तमान अभिविन्यास पोर्ट्रेट
  • है में परिदृश्य
  • है

उम्मीद है कि यह मदद करता है।

+0

मैंने पहले से ही न्यूटऑरोटेट में वापस लौटने की कोशिश की है लेकिन यह समस्या को ठीक नहीं करता है। मैं पहले समाधान की कोशिश करूंगा। धन्यवाद –

+0

[self.view setNeedsLayout] को कॉल करते समय भी समस्या को पुन: उत्पन्न करने में सक्षम था; –

0

मैंने अभी इसे लागू करने की कोशिश की। मैं आपके प्रश्न से समझ गया कि आप केवल लैंडस्केप मोड में मॉडल वीसी दिखाना चाहते हैं। यहां समाधान

1) प्रस्तुति शैली को अपने मॉडल वीसी में जोड़ें ताकि यह नीचे या आधा स्क्रीन से प्रदर्शित न हो। निम्नलिखित

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated];  
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), 
    dispatch_get_main_queue(), ^{ 
     self.modalViewController = [[ModalViewController alloc] init]; 
     self.modalViewController.modalPresentationStyle = UIModalPresentationFullScreen; 

     NSAssert([NSThread currentThread] == [NSThread mainThread], @"FAIL"); 

     [self presentViewController:self.modalViewController animated:YES completion:^{}]; 
    }); 
} 

2) मॉडल कुलपति इस

-(UIInterfaceOrientationMask)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; 
} 

3) को ovveriden विधि supportedInterfaceOrientations बदलने रोटेशन की स्पष्ट जानकारी प्राप्त करने के लिए मॉडल कुलपति पर एक दृश्य जोड़ने तो यह हो जाएगा करने के लिए FirstViewController कोड के स्थान पर स्पष्ट करें कि दृश्य घूर्णन कर रहा है या नहीं। मॉडल कुलपति में निम्न कोड जोड़ें

-(void)viewDidLoad  
{ 
    [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor greenColor]; 
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 100)]; 
    view.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:view]; 
} 

अब यह सब कर रही है अगर आप इसे लैंडस्केप मोड में मॉडल कुलपति खुलेगा केवल या तो घुमाया जा सकता है जो परिदृश्य में बाएं या दाएं लेकिन potrait बहुलक होगा एप्लिकेशन को खोलने का प्रयास करने के बाद विकलांग।

+0

समस्या अभी भी इस समाधान के साथ पुन: उत्पन्न की जा सकती है। –

संबंधित मुद्दे