根据UIView约束更新UITableView大小

时间:2014-11-24 13:04:58

标签: ios nslayoutconstraint

我有一个内置UITableView的UIView。

在UIViewController中,我像这样实例化UIView:

viewMain = [ViewMain alloc]initwithframe:cgrectmake(0,0,200,500)];

在这个视图中,在方法initWithFrame:(CGRect)框架中,我像这样实例化UITableView:

_tableView = [UITableView alloc]iniWithFrame:CGRectMake(0,0,frame.size.width,frame.size.height)];

问题是当我将约束应用于 viewMain 时,如何根据viewMain布局约束更新tableView的大小?

4 个答案:

答案 0 :(得分:1)

您需要向子视图添加约束(例如,如果超级视图发生更改,则自动布局),如下所示:

NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:viewMain attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:_tableView attribute:NSLayoutAttributeLeft multiplier:1 constant:0];
[_tableView addConstraint:left];

NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:viewMain attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:_tableView attribute:NSLayoutAttributeTop multiplier:1 constant:0];
[_tableView addConstraint:top];

NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:viewMain attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:_tableView attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
[_tableView addConstraint:width];

NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:viewMain attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:_tableView attribute:NSLayoutAttributeHeight multiplier:1 constant:0];
[_tableView addConstraint:height];

不确定是否还需要这样做:

_tableView.translatesAutoresizingMaskIntoConstraints = NO;

在添加约束之前。

答案 1 :(得分:0)

如果要使用框架设置表视图,则无法使用约束更新布局。如果要根据父视图更新表视图,请使用故事板中的约束来更新约束。

答案 2 :(得分:0)

基本上,您必须在-setNeedUpdateConstraints中的单元格上调用-updateConstraintsIfNeeded-tableView:cellForRowAtIndexPath:

请参阅this answer中的详细说明和示例代码。

这是一个很棒的Tutorial by Ray Wenderlich

你也可以在tableViewController中尝试这个:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (IS_IOS8_OR_ABOVE) {
        return UITableViewAutomaticDimension;
    }

    //self.prototypeCell.bounds = CGRectMake(0, 0, CGRectGetWidth(self.tableView.bounds), CGRectGetHeight(self.prototypeCell.bounds));

    [self configureCell:self.prototypeCell forRowAtIndexPath:indexPath];

    [self.prototypeCell updateConstraintsIfNeeded];
    [self.prototypeCell layoutIfNeeded];

    return [self.prototypeCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
}

答案 3 :(得分:0)

我会将tableView的帧设置为等于mainView的帧。 即:

_tableView = [UITableView alloc]iniWithFrame:CGRectMake(mainView.frame.origin.x,mainView.frame.origin.y,mainView.frame.size.width,mainView.frame.size.height)];