我有一个容器视图,它位于主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];
}
以上代码剪切确实执行(在视图控制器完全加载后),但对实际的hieght没有影响。
有没有人有这方面的经验?
我知道您可以将IBOutlet添加到NSLayoutConstraints(以获取对它们的引用),然后在运行时删除它们。这看起来比应该做的更多。我错过了什么吗?
答案 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]