目前,我正在使用UITableView以及UIScrollView中包含的其他视图。我希望UITableView的高度与其内容高度相同
更复杂的是,我还插入/删除行以提供手风琴效果,这样当用户点击一行时,它将显示该行的更多细节
我已经完成了插入/删除操作,但目前它没有更新作为其超级视图的UIScrollView,以便重新计算UIScrollView的内容大小,并正确显示UITableView以及UIScrollView中的其他视图
当我更改UITableView的内容时,如何实现这一点,以调整UIScrollView的大小并正确布局其内容?我目前正在使用自动布局
首先,这些其他视图(表视图的同级视图)是否严格位于表视图的上方和下方?如果是这样,您是否考虑过让表视图正常滚动,并将这些外部视图放在表视图的页眉和页脚视图中?那么您就不需要滚动视图了
第二,如果您还没有阅读技术说明TN2154:UIScrollView和Autolayout,那么您可能需要阅读
第三,根据技术说明中的信息,我可以想出一些方法来做你想做的事情。最干净的方法可能是创建实现intrinsicContentSize方法的UITableView的子类。实现过程非常简单:
@实现MyTableView
-(CGSize)intrinsicContentSize{
[self layoutifneed];//强制立即更新我的contentSize
返回CGSizeMake(uiviewnointrisicmetric,self.contentSize.height);
}
@结束
然后让自动布局使用表视图的固有内容大小。在滚动视图(包括表格视图)的子视图之间创建约束以进行布局,并确保滚动视图的所有四条边都有约束
您可能需要在适当的时间(添加或删除行或更改行的高度时)将invalidateIntrinsicContentSize发送到表视图。您可能只需要重写MyTableView中的相应方法即可。例如,在-endUpdates中执行[self invalidateIntrinsicContentSize],-reloadData,-insertRowsAtIndexPaths:withrow动画:,等等
以下是我的测试结果:
滚动视图的背景为浅蓝色。红色顶部标签和蓝色底部标签是滚动视图中表格视图的同级
下面是我测试中视图控制器的完整源代码。没有xib文件
导入“ViewController.h”
#导入“MyTableView.h”
@界面视图控制器()<;UITableViewDataSource、UITableViewDelegate>;
@结束
@实现视图控制器
-(void)负荷视图{
UIView*view=[[UIView alloc]init];
self.view=视图;
UIScrollView*scrollView=[[UIScrollView alloc]init];
scrollView.TranslatesAutoResizezingMaskintoConstraints=否;
scrollView.backgroundColor=[UIColor cyanColor];
[视图添加子视图:滚动视图];
UILabel*topLabel=[[UILabel alloc]init];
topLabel.translatesAutoresizingMaskIntoConstraints=否;
[email protected]“Top Label”;
topLabel.backgroundColor=[UIColor redColor];
[滚动视图添加子视图:topLabel];
UILabel*bottomLabel=[[UILabel alloc]init];
bottomLabel.translatesAutoresizingMaskIntoConstraints=否;
[email protected]“底部标签”;
bottomLabel.backgroundColor=[UIColor blueColor];
[滚动视图添加子视图:底部标签];
UITableView*tableView=[[MyTableView alloc]initWithFrame:CGRectZero样式:UITableView样式平面];
tableView.translatesAutoresizingMaskIntoConstraints=否;
tableView.dataSource=self;
tableView.delegate=self;
[滚动视图添加子视图:表视图];
UILabel*footer=[[UILabel alloc]initWithFrame:CGRectMake(0,0,200,30)];
footer.backgroundColor=[UIColor greenColor];
[email protected]“footer”;
tableView.tableFooterView=页脚;
NSDictionary*视图=NSDictionaryOfVariableBindings(
scrollView、topLabel、bottomLabel、tableView);
[查看添加约束:[NSLayoutConstraint]
VisualFormat的约束:@“V:|[scrollView]|”
选项:0指标:无视图:视图]];
[查看添加约束:[NSLayoutConstraint]
VisualFormat的约束:@“H:|[scrollView]|”
选项:0指标:无视图:视图]];
[查看添加约束:[NSLayoutConstraint]
VisualFormat的约束:@“V:|[topLabel][tableView][bottomLabel]|”
选项:0指标:无视图:视图]];
[查看添加约束:[NSLayoutConstraint]
VisualFormat的约束:@“H:|[topLabel]|”
选项:0指标:无视图:视图]];
[查看添加约束:[NSLayoutConstraint]
VisualFormat的约束:@“H:|-8-[tableView]-8-|”
选项:0指标:无视图:视图]];
[查看添加约束:[NSLayoutConstraint]
constraintWithItem:tableView属性:NSLayoutAttributeWidth
关系人:NSLayoutRelationEqual
toItem:视图属性:NSLayoutAttributeWidth
乘数:1常数:-16]];
[查看添加约束:[NSLayoutConstraint]
VisualFormat的约束:@“H:|[底部标签]|”
选项:0指标:无视图:视图]];
}
-(NSInteger)表视图:(UITableView*)表视图行数节:(NSInteger)节{
返回20;
}
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
UITableViewCell*单元格=[tableView dequeueReusableCellWithIdentifier:@“cell”];
如果(!单元格){
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault重用标识符:@“cell”];
}
cell.textLabel.text=[NSString stringWithFormat:@“行%d”,indexPath.Row];
返回单元;
}
@结束