与UITableView大小和NSLayoutConstraints战斗

时间:2013-03-20 17:39:37

标签: iphone ios ipad

我有一个容器视图,它位于主UIViewConroller的左侧。此容器视图由底部的几个按钮构成,中间的UITableView显示用户数据,顶部的另一个UITableView显示选定的用户数据。我想要这个顶级UITableView的行为,如果没有选定的数据它会消失,如果有,则达到最大高度200。选择的每个数据项将等同于表中的条目。

查看照片。在运行它的图片中,我加载了一个名为“test”的选定数据项:

enter image description here enter image description here

无论如何,我遇到的问题与Interface Builder创建的布局约束有关。以下是我为动态重新调整数据表大小和选定数据表所采取的步骤。

我已将最顶层的TableView设置为< = 200,将中间的一个保留为默认值,然后添加此代码以调整顶层表的大小:

-(void)setSelectedFacets:(NSArray *)selectedFacets{
    _selectedFacets = selectedFacets;
    [self.selectedFacetsTableView reloadData];

    CGRect frame = self.selectedFacetsTableView.frame;
    frame.size.height = 10 ;//36 * selectedFacets.count;
    self.selectedFacetsTableView.frame = frame;
    [self.selectedFacetsTableView setNeedsDisplay];
    [self.view setNeedsDisplay];
}

以上代码剪切确实执行(在视图控制器完全加载后),但对实际的hieght没有影响。

有没有人有这方面的经验?

我知道您可以将IBOutlet添加到NSLayoutConstraints(以获取对它们的引用),然后在运行时删除它们。这看起来比应该做的更多。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

如果您使用自动布局,则不应设置框架。只添加/删除/修改布局约束。

通过使用“Pin”和“Align”等按钮确保您在IB中仅使用NSLayoutConstraints。在源代码中可以访问tableView高度的约束:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *tableViewHeightConstraint;

实际设置高度的代码段应位于updateViewContraints

- (void)updateViewConstraints {
    CGFloat height = MAX(200.0f, 36.0f * selectedFacets.count);
    [self.tableView removeConstraint:self.tableViewHeightConstraint];
    NSLayoutConstraint *lc = [NSLayoutConstraint constraintWithItem:self.tableView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:height];
    [self.tableView addConstraint:lc];
    self.tableViewHeightConstraint = lc;
    [super updateViewConstraints];
}

setSelectedFacets:中,只需致电[self updateViewConstraints]