2013-08-20 68 views
9

Mục tiêu:Matching subview để nó SuperView sử dụng autolayout

Có một UIWebView có chiều rộng tương tự như nó SuperView, mà là một UIScrollView, sử dụng autolayout ràng buộc.

NSLayoutConstraint *makeWidthTheSameAsScrollView =[NSLayoutConstraint 
                 constraintWithItem:self.questionWebView 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:0 
                 toItem:self.masterScrollView 
                 attribute:NSLayoutAttributeWidth 
                 multiplier:1.0 
                 constant:0]; 

[self.view addConstraint:makeWidthTheSameAsScrollView]; 

NSLog(@"The width of questionWebView *AFTER* adding the constrain is: %f", self.questionWebView.frame.size.width); 
NSLog(@"The width of scrollView *AFTER* adding the constrain is: %f", self.masterScrollView.frame.size.width); 

Kết quả hiện tại

Khi tôi đăng nhập độ rộng của self.questionWebView (các UIWebView), chiều rộng của nó không thay đổi khi Constrain autolayout được áp dụng.

Câu hỏi

  • Đây có phải là cách tiếp cận đúng?
  • Tôi đang làm gì sai?

P.S Tôi biết nó là chống lại các khuyến nghị của Apple để đặt một UIWebView trong một UIScrollView, tuy nhiên tôi đã tắt khả năng di chuyển các UIWebView sử dụng tài sản self.questionWebView.userInteractionEnabled = NO;. Và hiện đang sử dụng UIWebView là chiến lược tốt nhất của tôi để hiển thị bảng HTML.

Trả lời

16

Cải thiện câu trả lời của Rob, theo yêu cầu.

Như Rob đã đề cập, UIScrollViews có hành vi đặc biệt trong Bố cục tự động.

Điều quan tâm trong trường hợp này là thực tế là tổng chiều rộng của scrollView được xác định bằng cách sử dụng tổng chiều rộng của tổng quan phụ. Vì vậy, trong khi scrollView đã yêu cầu webView cho chiều rộng của nó, bạn đang nói cho webView cũng yêu cầu scrollView cho chiều rộng của nó. Đó là lý do tại sao nó không hoạt động. Một là yêu cầu khác, và không ai biết câu trả lời. Bạn cần một khung nhìn tham chiếu khác để sử dụng như một ràng buộc cho webView, và sau đó scrollView cũng sẽ có thể hỏi thành công về chiều rộng dự kiến ​​của nó.

Một cách dễ dàng có thể thực hiện được: tạo một chế độ xem khác, containerView và thêm scrollView làm chế độ xem phụ vào đó. Sau đó, thiết lập các ràng buộc thích hợp cho containerView. Giả sử bạn muốn scrollView tập trung vào một viewController, với một số padding trên các cạnh.Vì vậy, làm điều đó cho containerView:

NSDictionary *dict = NSDictionaryOfVariableBindings(containerView); 
[self.view addConstraints:[NSLayoutConstraints constraintsWithVisualFormat:@"H|-(100)-[containerView]-(100)-|" options:0 metrics:0 views:dict]; 
[self.view addConstraints:[NSLayoutConstraints constraintsWithVisualFormat:@"V|-(100)-[containerView]-(100)-|" options:0 metrics:0 views:dict]; 

Sau đó, bạn có thể tiến hành thêm các WebView như là một subview đến scrollview và thiết lập chiều rộng của nó:

NSLayoutConstraint *makeWidthTheSameAsScrollView =[NSLayoutConstraint 
                 constraintWithItem:self.questionWebView 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:0 
                 toItem:containerView 
                 attribute:NSLayoutAttributeWidth 
                 multiplier:1.0 
                 constant:0]; 

[self.view addConstraint:makeWidthTheSameAsScrollView]; 

này sẽ làm cho scrollview lớn và cao như webView và cả hai đều sẽ được đặt như dự định (với các ràng buộc được đặt trên containerView).

+1

Bạn cũng có thể thực hiện điều này trong IB: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutbyExample/AutoLayoutbyExample.html#//apple_ref/doc/uid/TP40010853-CH5-SW5 "Tạo chế độ xem được lưu trữ bên trong chế độ xem cuộn" – Brenden

3

Chế độ xem cuộn hơi lạ một chút về cách chúng tương tác với bố cục tự động. Xem TN2154 (UIScrollView và Autolayout).

Xem thêm UIScrollView doesn't use autolayout constraints.

Nói chung, bạn cần lấy chiều rộng của chế độ xem có một số cách khác "chiều rộng hiện tại của chế độ xem cuộn" vì bố cục tự động chiều rộng của scrollview (tức là chiều rộng nội dung) được xác định theo nội dung của nó. Vì vậy, yêu cầu hiện tại của bạn là thông tư.

+2

Một chiến lược dễ dàng là thêm scrollView làm chế độ xem con cho chế độ xem khác (được đặt giống như scrollView) và đặt Bố cục tự động để sử dụng chiều rộng của chế độ xem này để đặt chế độ xem webView. –

+1

@AlohaSilver cảm ơn, hãy thêm câu trả lời này làm câu trả lời riêng biệt, tôi nghĩ rằng nó hữu ích được chia ra làm câu trả lời chứ không phải là nhận xét. – drc