UIPageViewController +自动布局旋转问题

时间:2013-07-18 16:40:59

标签: iphone ios rotation autolayout uipageviewcontroller

我有一个UIPageViewController,里面有一个简单的UIViewController。

如果UIViewController没有子视图,则其视图在旋转时会正确调整大小。 (纯绿色背景)。

portrait landscape

如果UIViewController具有带固定框架的子视图,则其视图在旋转时可以正确调整大小。 (坚实的绿色背景,角落里有黄色方块)。

portrait landscape

如果UIViewController有一个子视图,其自动布局约束设置为填充其超级视图,则其视图在旋转时不再正确调整大小。 (纯黄色背景,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];

portrait landscape

为什么子视图的自动布局会影响其超级视图?只有当它包含在UIPageViewController中时才会发生。

4 个答案:

答案 0 :(得分:10)

我也有这个问题,以前的答案似乎没什么帮助。我需要为与PageViewController一起使用的scrollview添加约束。

// 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)

答案 1 :(得分:7)

页面视图控制器的视图不是表示页面的视图的超级视图。页面视图控制器的视图具有由自定义滚动视图子类组成的视图层次结构,该滚动视图又具有三个通用视图子类,每个子类用于索引0到2中包含的视图控制器的视图。这些视图用作超视图你包含的观点。您必须将自动布局约束定位到这些视图。但是使用自动调整遮罩并让它们转换为自动布局约束要容易得多。

答案 2 :(得分:0)

我明白了:

我在容器控制器类中调用了[[_pageViewController view] setTranslatesAutoresizingMaskIntoConstraints:NO];,并没有在其视图(或视图,如Bored Astronaut提到的视图)上显式设置自动布局约束。

答案 3 :(得分:0)

@Bored宇航员的回答几乎对我有用。除了将自动调整蒙版转换为自动布局约束之外,我唯一做的就是设置output_to_plot = [] with open('multi_items.txt', 'r') as infile: for line in infile: output_to_plot.extend([float(item) for item in line.split(' ')]) print(output_to_plot) 的视图帧,然后再将其添加到父视图中。

UIPageViewController

在不设置框架的情况下,子视图控制器将以任何方向正确显示和定位,但其子视图不能正确布局。