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.)
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? –
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 ... –
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. –