2015-09-24 8 views
5

मैंने आईओएस 9 के पिछले संस्करणों की तुलना में आईओएस 9 लोड/डिस्प्ले दृश्यों में बदलाव देखा है। यहाँ iOS 8.4आईओएस 9 ने व्यू लोड व्यवहार बदल दिया

viewDidLoad {{0, 0}, {320, 504}} 
viewWillAppear {{0, 64}, {320, 504}} 
viewDidAppear {{0, 64}, {320, 504}} 

में self.view.frame का उत्पादन है कि viewWillAppear विधि में iOS 9self.view.frame की origin अद्यतन करने के लिए विफल रहता है के लिए iOS 9

viewDidLoad {{0, 0}, {320, 504}} 
viewWillAppear {{0, 0}, {320, 504}} 
viewDidAppear {{0, 64}, {320, 504}} 

सूचना ही है और यहाँ है।

इससे मेरे ऐप में कुछ समस्याएं होती हैं जैसे विचारों में शुरुआत में गलत तरीके से विचार होता है।

क्या किसी को पता है कि इसका इरादा है या यह एक दोष है? और शायद एक त्वरित फिक्स?

+0

क्यों यह परिवर्तन आपके लिए एक समस्या हो सकता है ? सबव्यूव्स को उनके मूल दृश्य के सीमाओं के आधार पर, आधार पर नहीं रखा जाना चाहिए। यह यहां अलग नहीं होगा। – rmaddy

+0

अच्छा बिंदु, केवल मैं 'यूआईटीएबीबार' की स्थिति को संभालने वाला हूं (कुछ स्क्रीनों में दिखा रहा हूं, जो दूसरों में छिप रहा है), जो 'self.view' का सबव्यू नहीं है। इसके अलावा, 'आईओएस 9' दृश्य आकार के साथ ही मूल को अपडेट करने में विफल रहता है। – artooras

+0

आपके द्वारा दिखाए जाने वाले आउटपुट से संकेत मिलता है कि दृश्य आकार अपडेट किया गया है। यह आईओएस के दोनों संस्करणों में 504 है। – rmaddy

उत्तर

1

मुझे पिछले आईओएस संस्करणों के मुकाबले आईओएस 9 में एक ही बदलाव मिला: viewWillAppear, self.view.frame और self.view.bounds केवल रनटाइम पर उपयोग किए जाने वाले आकार के बजाय निब में उपयोग किए गए डिफ़ॉल्ट आकार को दिखाते हैं। इसका मतलब है कि, उदाहरण के लिए, आपके निब में 320 की डिफ़ॉल्ट चौड़ाई है लेकिन आप इसे आईफोन 6 पर चलाते हैं, चौड़ाई को 375 के बजाय 320 के रूप में गलत तरीके से रिपोर्ट किया जाएगा।

आप [[यूआईस्क्रीन मुख्यस्क्रीन] सीमाओं का उपयोग कर सकते हैं] , जैसा कि सवाल पर टिप्पणियों में सुझाव दिया गया है, लेकिन यह केवल तभी काम करेगा जब आपके विचार हमेशा स्क्रीन भरें। यदि आपके पास एक आईपैड पर एक स्प्लिट-स्क्रीन डिज़ाइन है और आपको व्यक्तिगत दृश्य की वास्तविक प्रदर्शन चौड़ाई को जानने की आवश्यकता है, तो यह ViewWillAppear में उपलब्ध नहीं है।

आप viewWillAaypear के बजाय viewWillLayoutSubviews का उपयोग कर सकते हैं, क्योंकि फ्रेम और सीमाएं उस बिंदु पर सही ढंग से सेट की गई हैं। हालांकि, यह हर बार एक दृश्य प्रकट होता है, केवल तभी दिखाई देता है जब आपका पहला व्यवहार दिखाई देता है, इसलिए आपका ऐप व्यवहार थोड़ा बदल जाएगा।

मैं, viewWillAppear और viewWillLayoutSubviews के संयोजन का उपयोग कर रहा हूँ एक नया उदाहरण चर के साथ साथ, आईओएस 9 में पूर्व आईओएस 9 व्यवहार को दोहराने के लिए:

@synthesize sizingReady; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // set a flag telling us whether the view size is available 
    // this is needed in iOS 9 because the view size isn't updated in viewWillAppear yet 
    self.sizingReady = FALSE; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    // don't do anything until the view size is available, which doesn't happen until viewWillLayoutSubviews in iOS 9 
    if (!self.sizingReady) { 
     return; 
    } 

    [super viewWillAppear:animated]; 

    // your code goes here 
} 

- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 

    if (!self.sizingReady) { 
     self.sizingReady = TRUE; 
     [self viewWillAppear:TRUE]; 
    } 
} 
0

आप विधि swizzling कर सकते हैं viewWillAppear:, और उपयोग स्क्रीन सीमा

 


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

    self.view.frame = [UIScreen mainScreen].bounds; 
} 

 

या

 


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

    self.view.frame = [UIScreen mainScreen].bounds; 
} 

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