更改一个子视图的大小后如何触发自动布局?

时间:2017-03-27 21:59:52

标签: ios autolayout

我正在制作一个视图控制器,顶部有一个搜索栏,一个表格视图填充了视图的其余部分。

enter image description here

现在我需要搜索栏的可见性才能配置。我在做什么是这样的:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    if (!(self.bShowSearchBar)) {
        [self.searchBar setHidden:YES];
        CGRect frameSearchBar = self.searchBar.frame;
        frameSearchBar.size.height = 0;
        [self.searchBar setFrame:frameSearchBar];
        NSLog(@"self.searchBar.frame: %@", NSStringFromCGRect(self.searchBar.frame));
        NSLog(@"self.tableView.frame: %@", NSStringFromCGRect(self.tableView.frame));
    }
}

隐藏搜索栏时,表视图的位置未正确调整。 NSLog显示搜索栏的框架已经更改,而表格视图的框架拒绝调整:

2017-03-27 15:37:41.204413 App[2071:954793] self.searchBar.frame: {{0, 0}, {375, 0}}
2017-03-27 15:37:41.204675 App[2071:954793] self.tableView.frame: {{0, 44}, {375, 623}}

但它没有正确显示。搜索栏的位置仍然存在。

enter image description here

我也试过

 (1) [self.tableView setNeedsLayout];
     [self.tableView layoutIfNeeded];

 (2) [self.view layoutSubviews];

在我将搜索栏高度设置为0之后,但没有一个工作。

那么在修改一个子视图的大小后,如何重新触发自动布局?提前谢谢。

2 个答案:

答案 0 :(得分:2)

您无法在Autolayout中更改视图的框架。如果您打开Autolayout选项,它将无效。您应该更改约束。

从你的照片来看, enter image description here

按下控件并将此约束拖到.m文件中,使其成为属性。

如果您想进行一些更改,只需更改此属性即可。

请参阅您的案例,在viewDidLoad中,您可以将搜索栏的顶部设置为等于-44,因为搜索栏的高度等于44,然后-44表示屏幕上方44点。通过此更改, tableview也会改变它的框架,因为它对搜索栏的底部约束等于0.现在你隐藏了你的搜索栏并使得tableview的框架正确。

答案 1 :(得分:0)

感谢Henson,为了方便起见,解决方案就是这样:

(1)从Interface Builder中删除“Search Bar.top = top”;

(2)在viewDidLoad中,

if (self.bShowSearchBar) {
    [self.searchBar setHidden:NO];
    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.searchBar attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0];
    [self.view addConstraint:topConstraint];
}
else {
    [self.searchBar setHidden:YES];
    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.searchBar attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:-44.0];
    [self.view addConstraint:topConstraint];
}
[self.view updateConstraints];

它完美无缺!