2013-07-18 14 views
12

मेरे पास एक सरल UIViewController के साथ एक UIPageViewController है।UIPageViewController + ऑटो लेआउट रोटेशन समस्या

यदि UIViewController के पास कोई सबव्यू नहीं है, तो घूर्णन के दौरान इसका दृश्य सही ढंग से आकार बदलता है। (ठोस हरी पृष्ठभूमि)।

portraitlandscape

UIViewController एक निश्चित फ्रेम के साथ एक subview नहीं है तो उसके दृश्य सही ढंग से जब घुमाया आकार बदलता है। (कोने में पीले रंग के वर्ग के साथ ठोस हरी पृष्ठभूमि)।

portraitlandscape

UIViewController अपने ऑटो लेआउट की कमी इसकी superview को भरने के लिए सेट के साथ एक subview नहीं है तो उसके दृश्य अब ठीक से आकार बदलता है जब घुमाया। (UIPageViewController की लाल पृष्ठभूमि दृश्य के साथ ठोस पीले रंग की पृष्ठभूमि)। ऑटो लेआउट कोड मैं का उपयोग करें:

UIView *v = [[UIView alloc] init]; 
[v setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[v setBackgroundColor:[UIColor yellowColor]]; 
[[self view] addSubview:v]; 

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(v); 

NSArray *cs = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v]|" options:0 metrics:nil views:viewsDictionary]; 
[[self view] addConstraints:cs]; 

cs = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[v]|" options:0 metrics:nil views:viewsDictionary]; 
[[self view] addConstraints:cs]; 

portraitlandscape

क्यों एक subview के ऑटो लेआउट अपने superview प्रभाव पड़ेगा? यह केवल तब होता है जब यह UIPageViewController के भीतर निहित है।

उत्तर

0

मैं यह पता लगा:

मैं कंटेनर नियंत्रक कक्षा में [[_pageViewController view] setTranslatesAutoresizingMaskIntoConstraints:NO]; बुलाया था और स्पष्ट रूप से अपने दृष्टिकोण पर ऑटो लेआउट की कमी (या दृश्य के रूप में ऊबा अंतरिक्ष यात्री उल्लेख) सेट नहीं।

+2

अरे सीनियर - मुझे आपके प्रश्न में वर्णित सटीक समस्या है। क्या आप इस उत्तर के साथ थोड़ा सा नमूना कोड प्रदान करने में सक्षम होंगे? मैं विजुअल फॉर्मेट लैंग्वेज (जैसे आप की तरह) के माध्यम से ऑटो लेआउट के साथ सबकुछ कर रहा हूं, और जब मैं घुमाता हूं, तो मेरा यूआईपीएज व्यू कंट्रोलर ठीक वही करता है जो आपने किया था। आपने कहा "और स्पष्ट रूप से ऑटो लेआउट बाधाओं को इसके दृश्य पर सेट नहीं किया है" - यदि आप इसके लिए कोड प्रदान कर सकते हैं, तो यह मुझे बहुत मदद करेगा और एक पूर्ण उत्तर प्रदान करेगा। धन्यवाद! – DiscDev

7

पृष्ठ दृश्य नियंत्रक का दृश्य पृष्ठों का प्रतिनिधित्व करने वाले विचारों का पर्यवेक्षण नहीं है। पेज व्यू कंट्रोलर के व्यू में कस्टम स्क्रॉल व्यू सबक्लास शामिल एक दृश्य पदानुक्रम है, और बदले में स्क्रॉल व्यू में तीन जेनेरिक व्यू सबक्लास हैं, प्रत्येक में इंडेक्स 0 से 2 पर निहित व्यू कंट्रोलर के विचारों के लिए प्रत्येक एक है। वे पर्यवेक्षकों के रूप में कार्य करते हैं आपके निहित विचार आपको उन विचारों पर अपनी ऑटो लेआउट बाधाओं को लक्षित करना होगा। लेकिन ऑटोरेसाइजिंग मास्क का उपयोग करना बहुत आसान है और उन्हें ऑटो लेआउट बाधाओं में परिवर्तित करने दें।

+0

ऑटोरेसाइजिंग मास्क का उपयोग करना समस्या को हल करता है, धन्यवाद। मैं अभी भी अनिश्चित हूं कि निहित UIViewController का दृश्य उसके बच्चे के दृश्य की ऑटो लेआउट बाधाओं से क्यों प्रभावित होगा। – Senior

10

मुझे यह समस्या भी थी और पिछले उत्तर बहुत मदद नहीं कर रहे थे। मुझे PageViewController के साथ उपयोग किए गए स्क्रॉलव्यू में बाधाएं जोड़ने की आवश्यकता थी।

// Add Paging View Controller 
self.addChildViewController(self.pageViewController) 
self.pageViewController.didMoveToParentViewController(self) 
self.containerView.addSubview(self.pageViewController.view) 

// Add Constraints 
var verticalConstraints:Array = NSLayoutConstraint.constraintsWithVisualFormat("V:|[View]|", options: nil, metrics: nil, views: ["View":self.pageViewController.view]) 
var horizontalConstraints:Array = NSLayoutConstraint.constraintsWithVisualFormat("|[View]|", options: nil, metrics: nil, views: ["View":self.pageViewController.view]) 

self.pageViewController.view.setTranslatesAutoresizingMaskIntoConstraints(false) 
self.containerView.addConstraints(verticalConstraints) 
self.containerView.addConstraints(horizontalConstraints) 

// Add Constraints for the Scrollview 
//This line is a bit of a hack. If Apple ever changes the structure of the UIPageViewController, this could break. 
let scrollView = self.pageViewController.view.subviews.first! as UIView 
scrollView.setTranslatesAutoresizingMaskIntoConstraints(false) 
verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[View]|", options: nil, metrics: nil, views: ["View":scrollView]) 
horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("|[View]|", options: nil, metrics: nil, views: ["View":scrollView]) 
self.pageViewController.view.addConstraints(verticalConstraints) 
self.pageViewController.view.addConstraints(horizontalConstraints) 
+0

अच्छा, मैं इस उत्तर के साथ एक कंटेनर के अंदर UIPageViewController के साथ अपने ऑटोलाउट मुद्दों को ठीक करने में सक्षम था। – Paludis

+0

धन्यवाद! तुम मेरे स्वामी हो :) – Unmerciful

0

@ बोअर अंतरिक्ष यात्री उत्तर लगभग मेरे लिए काम करता है। ऑटो लेआउट बाधाओं में कनवर्ट करने के लिए ऑटोरेसाइजिंग मास्क छोड़ने के अलावा मैंने केवल एक चीज है जिसे इसे पैरेंट व्यू में जोड़ने से पहले UIPageViewController के दृश्य फ्रेम को सेट करना है।

[self addChildViewController:pageViewController]; 
pageViewController.view.frame = self.view.frame; 
[self.view addSubview:pageViewController.view]; 
[pageViewController didMoveToParentViewController:self]; 

फ्रेम की स्थापना के बिना, बच्चे दृश्य नियंत्रकों प्रदर्शित किया जाएगा और किसी भी अभिविन्यास में सही स्थान पर रखने, लेकिन उनके subviews ठीक से layouted नहीं किया जाएगा।