2013-07-29 28 views
5

Tôi có hai bộ điều khiển chế độ xem, cha mẹ và con.Ràng buộc tự động hoàn tất và bộ điều khiển xem trẻ em

Vì vậy, trong phương pháp viewDidLoad tôi làm như sau:

ChildViewController* childViewController = [[ChildViewController alloc] init]; 

[self addChildViewController:childViewController]; 

// ChildViewController sets his own constraints in viewDidLoad 
[self.view addSubview:childViewController.view]; 

[childViewController didMoveToParentViewController:self]; 

// 
// setup constraints to expand childViewController.view to 
// fill the size of parent view controller 
// 

Vì vậy, về cơ bản những gì xảy ra là updateViewConstraints được kêu gọi ChildViewController trước khi chế điều khiển cha mẹ áp dụng, vì vậy trên thực tế self.view.frame == CGRectZero, chính xác giống như tôi đã chỉ định trong tùy chỉnh phương thức loadView trong ChildViewController.

translatesAutoresizingMaskIntoConstraints tất cả được đặt thành NO cho tất cả chế độ xem.

Cách thích hợp để thiết lập các ràng buộc trong trường hợp này là như vậy ChildViewController cập nhật các ràng buộc của mình sau khi cha mẹ?

hiện log từ cả hai bộ điều khiển là khá bực bội, tôi không hiểu làm thế nào updateViewConstraints có thể được gọi trước khi viewWillLayoutSubviews:

App[47933:c07] ChildViewController::updateViewConstraints. RECT: {{0, 0}, {0, 0}} 
App[47933:c07] ParentViewController::updateViewConstraints 
App[47933:c07] ChildViewController:viewWillLayoutSubviews. RECT: {{0, 0}, {984, 454}} 
App[47933:c07] ChildViewController:viewDidLayoutSubviews. RECT: {{0, 0}, {984, 454}} 
+0

Bạn cần hiển thị mã nơi bạn thực sự thêm các ràng buộc của mình, nếu không khó có thể nói điều gì sai. – Maarten

+0

@ Marta Tôi giải quyết vấn đề và đăng câu trả lời dưới đây, không chắc đó là giải pháp mà tôi đang tìm kiếm, có vẻ như sai, nhưng nó hoạt động. Rất tiếc, tôi không thể đăng mã, quá nhiều mã ... – Andy

Trả lời

1

Theo the following link, tôi đã chuyển các ràng buộc tạo thành viewWillLayoutSubviews, đây là nơi giới hạn chế độ xem được đặt chính xác. Tôi cảm thấy câu trả lời này bỏ lỡ giải thích về lý do tại sao UpdateViewConstraints của bộ điều khiển xem con được gọi trước bộ điều khiển chế độ xem gốc hoặc có thể chỉ là một số lỗi trong mã của tôi, nhưng giải pháp này giải quyết được vấn đề ...

1
  1. Tôi nghĩ rằng phương pháp layoutIfNeeded sẽ chỉ làm việc nếu trước đó bạn đã gọi setNeedsLayout. Nếu bạn sử dụng setNeedsLayout thay vào đó, hệ thống sẽ biết cập nhật vào thời điểm thích hợp. Hãy thử thay đổi điều đó trong mã của bạn.

  2. Khi bạn thêm các ràng buộc vào chế độ xem, chế độ xem đó sẽ tự động bố trí lại các lần xem phụ của nó để giải thích các ràng buộc mới. Không cần phải gọi setNeedsLayout trừ khi có điều gì đó đã thay đổi kể từ khi bạn thêm các ràng buộc. Bạn có thêm các ràng buộc vào một khung nhìn và nếu có: bạn có thêm chúng vào khung nhìn đúng không?

  3. Một điều bạn có thể thử là để phân lớp UIView để bạn thấy một thông báo đăng nhập bất cứ khi nào ChildViewController.view hoặc ParentViewController.view thực hiện một cách bố trí tươi:

    -(void) layoutSubviews { 
        [super layoutSubviews]; 
        NSLog(@"layoutSubviews was called on the following view: %@", [view description]); 
    } 
    

Có lẽ đó sẽ tiết lộ điều gì đó về khi quan điểm của bạn (hoặc không) bố trí các phần phụ của họ.

+0

Phải, bố cụcNếu được thực hiện không thực sự thay đổi bất cứ điều gì nếu setNeedsUpdateConstraints không được sử dụng trước đây. Đó là nhật ký của tôi tại thời điểm này: ChildViewController :: updateViewConstraints. RECT: {{0, 0}, {0, 0}} ParentViewController :: updateViewConstraints ChildViewController_view :: layoutSubviews – Andy

+0

Vì vậy, Bộ điều khiển con được cập nhật trước, sau đó là cấp độ gốc. Tất cả các ràng buộc được tạo trong viewDidLoad, vì vậy tôi không hiểu chính xác nó có thể như thế nào. – Andy

3

Tôi có tình huống tương tự bộ điều khiển con đến bộ điều khiển hiển thị (cửa sổ bật lên).

Tôi xác định bộ điều khiển xem con trong trình tạo giao diện. Đó là phương thức viewDidLoad chỉ cần gọi setTranslatesAutoresizingMaskIntoConstraints: NO

Sau đó, tôi định nghĩa phương thức này trên bộ điều khiển con có tham số UIViewController, là cha mẹ. Phương pháp này thêm nó vào bộ điều khiển xem cha mẹ nhất định và xác định những hạn chế riêng của mình:

- (void) addPopupToController:(UIViewController *)parent { 
    UIView *view = [self view]; 
    [self willMoveToParentViewController:parent]; 
    [parent addChildViewController:self]; 
    [parent.view addSubview:view]; 
    [self didMoveToParentViewController:parent]; 

    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[view]-0-|" 
                      options:0 
                      metrics:nil 
                       views:NSDictionaryOfVariableBindings(view)]; 
    [parent.view addConstraints:horizontalConstraints]; 

    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[view]-0-|" 
                      options:0 
                      metrics:nil 
                      views:NSDictionaryOfVariableBindings(view)]; 
    [parent.view addConstraints:verticalConstraints]; 
} 

sau đó bên phụ huynh UIViewController (một trong đó đã được hiển thị), khi tôi muốn hiển thị điều khiển xem cửa sổ bật lên con tôi nó gọi :

PopUpNotificationViewController *popup = [[self storyboard] instantiateViewControllerWithIdentifier:@"NotificationPopup"]; 
[popup addPopupToController:self]; 

Bạn có thể xác định bất kỳ ràng buộc nào bạn muốn trên chế độ xem của trình điều khiển con khi thêm vào chế độ xem của trình điều khiển chính.

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