2013-07-18 35 views
12

Tôi có UIPageViewController với UIViewController đơn giản bên trong nó.Sự cố xoay vòng UIPageViewController + Bố cục tự động

Nếu UIViewController không có bản xem trước, chế độ xem của nó sẽ thay đổi kích thước chính xác khi được xoay. (Nền xanh lục).

portraitlandscape

Nếu các UIViewController có một subview với một khung cố định, quan điểm của mình thay đổi kích thước một cách chính xác khi xoay. (Nền xanh lục với hình vuông màu vàng ở góc).

portraitlandscape

Nếu các UIViewController có một subview với các ràng buộc bố trí ô tô của mình thiết lập để điền SuperView của nó, xem nó không còn thay đổi kích thước một cách chính xác khi xoay. (Nền màu vàng chắc chắn với nền đỏ của UIPageViewController có thể nhìn thấy). Mã bố trí ô tô tôi sử dụng là:

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

Tại sao bố trí ô tô của một subview ảnh hưởng SuperView của nó? Điều này chỉ xảy ra nếu nó được chứa trong một UIPageViewController.

Trả lời

0

I figured it out:

Tôi đã gọi [[_pageViewController view] setTranslatesAutoresizingMaskIntoConstraints:NO]; trong lớp điều khiển container và không được thiết lập một cách rõ ràng những hạn chế bố trí tự động trên quan điểm của mình (hoặc quan điểm, như Bored Astronaut đề cập).

+2

Hey Senior - Tôi gặp vấn đề tương tự như được mô tả trong câu hỏi của bạn. Bạn có thể cung cấp một mã mẫu nhỏ với câu trả lời này không? Tôi đang làm tất cả mọi thứ với bố trí tự động thông qua ngôn ngữ định dạng Visual (giống như bạn), và khi tôi xoay, UIPageViewController của tôi không chính xác những gì bạn đã làm. Bạn đã nói "và không đặt rõ ràng ràng buộc bố cục tự động trên chế độ xem của nó" - nếu bạn có thể cung cấp mã cho điều đó, nó sẽ giúp tôi vô cùng và cung cấp câu trả lời hoàn chỉnh hơn. Cảm ơn! – DiscDev

7

Chế độ xem của trình điều khiển chế độ xem trang không phải là phần giám sát của các chế độ xem đại diện cho các trang. Khung nhìn của trình điều khiển xem trang có phân cấp khung nhìn bao gồm một lớp con xem cuộn tùy chỉnh, và lần lượt cuộn đó có ba lớp con xem chung, mỗi cái cho các khung nhìn của các bộ điều khiển khung nhìn tại các chỉ mục từ 0 đến 2. các chế độ xem được chứa của bạn. Bạn sẽ phải nhắm mục tiêu các ràng buộc bố cục tự động của mình cho các chế độ xem đó. Nhưng nó dễ dàng hơn nhiều để sử dụng các mặt nạ autoresizing và để cho họ được chuyển đổi thành ràng buộc bố trí tự động.

+0

Sử dụng mặt nạ tự động sửa chữa sự cố, cảm ơn. Tôi vẫn không chắc chắn tại sao chế độ xem của UIViewController chứa sẽ bị ảnh hưởng bởi các ràng buộc bố trí tự động của chế độ xem con của nó. – Senior

10

Tôi cũng gặp sự cố này và các câu trả lời trước đây dường như không giúp ích gì nhiều. Tôi cần thêm các ràng buộc vào scrollview được sử dụng với 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

Đẹp nhất, tôi đã có thể khắc phục sự cố AutoLayout của mình với UIPageViewController bên trong một vùng chứa có câu trả lời này. – Paludis

+0

Cảm ơn bạn! Bạn là chủ nhân của tôi :) – Unmerciful

0

@Bored Phi hành gia trả lời gần như đã làm việc cho tôi. Điều duy nhất tôi đã làm bên cạnh việc để lại các mặt nạ tự động hóa để chuyển sang các ràng buộc bố trí tự động là đặt khung xem của UIPageViewController, trước khi thêm nó vào chế độ xem cha mẹ.

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

Nếu không đặt khung, bộ điều khiển chế độ xem con sẽ được hiển thị và định vị chính xác theo hướng bất kỳ, nhưng phần phụ của chúng sẽ không được bố trí đúng cách.

Các vấn đề liên quan