2013-05-28 18 views
7

Tôi có bộ điều khiển chế độ xem sở hữu một chế độ xem tùy chỉnh; chế độ xem tùy chỉnh vẽ bảng trò chơi bằng cách sử dụng Đồ họa cốt lõi. (Không có các bản xem trước khác.)Tại sao chế độ giám sát với tiểu sử của tôi co lại khi được trình bày một cách bình thường (sử dụng Bố cục Tự động)?

Tôi thiết lập các ràng buộc Bố cục Tự động để bảng trò chơi điền vào người giám sát của nó. Khi tôi đặt bộ điều khiển xem làm bộ điều khiển chế độ xem gốc, thì bảng trò chơi (và giám sát) sẽ lấp đầy màn hình, như ý định của tôi. Tuy nhiên, khi tôi trình bày bộ điều khiển xem một cách bình thường, bảng trò chơi (và superview) co lại thành không có gì/tối thiểu và theo dõi bố cục tự động báo cáo bố cục không rõ ràng.

Tôi đã viết một trường hợp thử nghiệm được đơn giản hóa để minh họa câu hỏi.

Đây là số BoardViewController của tôi, có chế độ xem cấp cao nhất với nền màu xanh lá cây, nhưng tạo ra một chế độ xem phụ mở rộng với nền màu đỏ. Tôi muốn xem màn hình tất cả màu đỏ khi bộ điều khiển chế độ xem này chiếm hết:

- (void)loadView 
{ 
    UIView *mainView = [[UIView alloc] init]; 
    mainView.translatesAutoresizingMaskIntoConstraints = NO; 
    mainView.backgroundColor = [UIColor greenColor]; 

    UIView *subView = [[UIView alloc] init]; 
    subView.translatesAutoresizingMaskIntoConstraints = NO; 
    subView.backgroundColor = [UIColor redColor]; 

    [mainView addSubview:subView]; 
    self.view = mainView; 

    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(subView); 
    NSArray *c1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subView(>=10)]|" 
                 options:0 
                 metrics:nil 
                  views:viewsDictionary]; 
    NSArray *c2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subView(>=10)]|" 
                 options:0 
                 metrics:nil 
                  views:viewsDictionary]; 
    [self.view addConstraints:c1]; 
    [self.view addConstraints:c2]; 
} 

Nếu tôi đặt bộ điều khiển này làm bộ điều khiển gốc, thì tôi thấy bảng trò chơi màu đỏ đẹp của tôi đang làm đầy màn hình. Tuy nhiên, hội đồng quản trị trò chơi co lại cho vuông 10x10 tối thiểu khi tôi trình bày các BoardViewController từ một khác nhau RootViewController:

- (void)loadView 
{ 
    UIView *rootView = [[UIView alloc] init]; 
    rootView.translatesAutoresizingMaskIntoConstraints = NO; 

    UIButton *presentButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    presentButton.translatesAutoresizingMaskIntoConstraints = NO; 
    [presentButton setTitle:@"Present" forState:UIControlStateNormal]; 
    [presentButton addTarget:self 
        action:@selector(present:) 
      forControlEvents:UIControlEventTouchUpInside]; 

    [rootView addSubview:presentButton]; 
    self.view = rootView; 

    [rootView addConstraint:[NSLayoutConstraint constraintWithItem:presentButton 
                 attribute:NSLayoutAttributeCenterX 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:rootView 
                 attribute:NSLayoutAttributeCenterX 
                 multiplier:1.0 
                 constant:0.0]]; 
    [rootView addConstraint:[NSLayoutConstraint constraintWithItem:presentButton 
                 attribute:NSLayoutAttributeCenterY 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:rootView 
                  attribute:NSLayoutAttributeCenterY 
                 multiplier:1.0 
                 constant:0.0]]; 
} 

- (void)present:(id)sender 
{ 
    BoardViewController *bvc = [[BoardViewController alloc] init]; 
    [self presentViewController:bvc animated:YES completion:NULL]; 
} 

Tôi cứ cố gắng quy tắc Auto Layout khác nhau, nhưng không có vấn đề gì tôi làm, tôi không thể nhận được các trò chơi hội đồng quản trị để điền vào màn hình khi bộ điều khiển xem được trình bày một cách bình thường. (Đồng thời tôi hỏi câu hỏi này, tôi đang cố gắng để có được thời gian chạy để cho tôi biết những gì nó nghĩ là mơ hồ. Nhưng tôi không phải là rất tốt gỡ lỗi này chưa, do đó câu hỏi của tôi ở đây.)

Trả lời

2

Xóa:

mainView.translatesAutoresizingMaskIntoConstraints = NO;

Điều thú vị là nó hoạt động. Nó ngụ ý rằng khi khung nhìn được trình bày một cách bình thường bằng cách sử dụng presentViewController, nó được dự kiến ​​sẽ có những ràng buộc liên quan đến giám sát của nó, nhưng khi được đặt là rootViewController của một UIWindow nó không cần chúng ...

+0

Brilliant! Cảm ơn bạn! Vì vậy, giải thích: Tôi đã sai lầm với cách bố trí của quan điểm cấp cao nhất của tôi, đó là sự xem xét của bất cứ ai giới thiệu tôi. Trong trường hợp này, 'presentViewController: animate: completion:' (chúng ta giả định) bổ sung các khung nhìn của nó bằng cách sử dụng các luồng và các thanh chống, vì vậy tôi đã phá vỡ nó. Đó có phải là cách công bằng không? –

+0

Từ những gì tôi có thể thấy có vẻ như là 'rootViewController' của một cửa sổ là một trường hợp đặc biệt mà bỏ qua các ràng buộc.Sẽ rất thú vị khi thử nghiệm với những gì sẽ xảy ra nếu bạn để trong 'mainView.translatesAutoresizingMaskIntoConstraints = NO;' và thực hiện 'updateConstraints' để thêm một số ràng buộc theo cách thủ công ... –

+0

Tôi đã thử đổ giá trị của' [self.view translatesAutoresizingMaskIntoConstraints] ' tại 'viewDidAppear:' cho cả hai bản trình bày phương thức và được thiết lập-as-root-view-controller. Trong cả hai trường hợp, nó đổ ra YES. Có thể đặt chế độ xem làm bộ điều khiển chế độ xem gốc đặt rõ khung của nó, trong khi trình bày trình điều khiển chế độ xem thì không. –

2

Sau khi điều tra, có vẻ như giống như khi bạn đẩy một bộ điều khiển chế độ xem toàn màn hình và hoạt ảnh hoàn tất, trình điều khiển chế độ xem trình bày cùng với chế độ xem của nó đang bị xóa khỏi hệ thống phân cấp chế độ xem. Theo dự kiến, các ràng buộc về khung nhìn đang được gỡ bỏ sau đó. Khi bạn bỏ qua bộ điều khiển xem phương thức, trình điều khiển chế độ xem ban đầu với chế độ xem của nó sẽ xuất hiện trở lại, nhưng các ràng buộc đã biến mất và chưa được hệ thống lưu và khôi phục. Đó là một lỗi. Ngay cả trên iOS7. Lý do tại sao sử dụng NSAutoresizingConstraints hoạt động là, hệ thống xem có thể tự xây dựng lại các ràng buộc.

Lưu ý: nếu bạn có thiết lập với chế độ xem lồng nhauControlers (ví dụ: một điều khiển xem bên ngoài nhúng trình điều khiển điều hướng), thì bạn có thể liên kết chúng bằng cách sử dụng mẫu con viewcontrollers. Nếu bạn đã làm như vậy, chế độ xem ViewController trên cùng sẽ bị xóa theo những gì tôi đã mô tả ở trên. Điều này có nghĩa rằng bạn chỉ phải áp dụng bản vá NSAutoresizingConstraints cho bộ điều khiển xem trên cùng đó (thường là trình quản lý khung nhìn gốc của Windows) và sử dụng các ràng buộc chuẩn bất cứ nơi nào inbetween.

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