1

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

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

在此处输入图像描述 在此处输入图像描述

无论如何,我遇到的问题与 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];
}

上面的代码片段确实执行(在视图控制器完全加载后),但对实际高度没有影响。

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

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

4

1 回答 1

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]

于 2013-08-27T08:18:29.263 回答