如何动态设置 UITableView 的高度?
Posted
技术标签:
【中文标题】如何动态设置 UITableView 的高度?【英文标题】:How to dynamically set the height of a UITableView? 【发布时间】:2013-09-13 11:01:59 【问题描述】:我有一个使用heightForRowAtIndexPath:
方法的具有不同单元格高度的表格视图。
我想动态设置UITableView
的高度。目前我正在使用viewDidLoad
方法设置tableView 的尺寸:
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(10, 770, 310, 400)];
self.tableView.dataSource = self;
self.tableView.delegate = self;
我想也许我可以添加这个:self.tableView.contentSize.height;
但问题当然是内容大小仅在表格加载后计算,所以如果我把它放在
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(10, 770, 310, self.tableView.contentSize.height)];
它不起作用。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *description = [photosFromCommentsArray objectAtIndex:indexPath.row];
// NSLog(@"description is %@",description);
if(description == (id)[NSNull null])
return 70;
else
return 200;
【问题讨论】:
更改高度后是否重新加载表格? 【参考方案1】:为table view的contentSize属性添加观察者,并相应调整frame
[self.tableView addObserver:self forKeyPath:@"contentSize" options:0 context:NULL];
然后在回调中:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
CGRect frame = self.tableView.frame;
frame.size = self.tableView.contentSize;
self.tableView.frame = frame;
【讨论】:
太棒了!工作完美,谢谢!它现在确实会关闭我的滚动视图,所以我必须调整它,因为 tableview 不在屏幕上。 @Rushabh 它在 addObserver 调用中的 self 类中 值得注意的是,确保在完成所有操作后删除Observer。【参考方案2】:你可以随时设置tableView的frame。您甚至可以为大小的变化设置动画。
【讨论】:
【参考方案3】:您好,您可以使用下面的代码获取文本的高度并根据它设置高度。
CGFloat textViewWidth = CGRectGetWidth(textView.bounds);
CGSize inset = CGSizeMake(5.0,5.0);
CGSize stringSize = [myString sizeWithFont:textView.font constrainedToSize:CGSizeMake(textViewWidth-2*inset.width,1024) lineBreakMode:UILineBreakModeWordWrap];
BOOL textOutOfFit = stringSize.height+2*inset.height>CGRectGetHeight(textView.bounds);
【讨论】:
【参考方案4】:在 viewDidLoad 中试试这个:
[tableView setFrame:CGRectMake(tableView.frame.origin.x, tableView.frame.origin.y + 4, tableView.frame.size.width, tableView.frame.size.height - 65)];
【讨论】:
【参考方案5】:第 1 步:在 viewDidLoad() 中添加观察者
self.tableView.addObserver(self, forKeyPath: "contentSize", options: [], context: nil)
第二步:添加方法
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
self.tableViewHeight.constant = tableView.contentSize.height
第 3 步:移除观察者
override func viewDidDisappear(_ animated: Bool)
self.removeObserver(self, forKeyPath: "contentSize", context: nil)
替代解决方案:
tableView.separatorStyle = .none
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = CGFloat(70.0)
self.tableViewHeight.constant = CGFloat.greatestFiniteMagnitude self.tableView.layoutIfNeeded()
self.tableView.reloadData()
覆盖 func viewWillLayoutSubviews() super.viewWillLayoutSubviews()
UIView.animate(withDuration: 0, animations:
self.tableView.layoutIfNeeded()
) (complete) in
var heightOfTableView: CGFloat = 0.0
// Get visible cells and sum up their heights
let cells = self.tableView.visibleCells
for cell in cells
heightOfTableView += cell.frame.height
// Edit heightOfTableViewConstraint's constant to update height of table view
self.tableViewHeight.constant = heightOfTableView
另一种解决方案:
self.tableViewHeight.constant = CGFloat(arrVideoList.count * 80)
self.view.updateConstraintsIfNeeded()
【讨论】:
以上是关于如何动态设置 UITableView 的高度?的主要内容,如果未能解决你的问题,请参考以下文章
iOS:在 Swift 中动态设置 UITableView 高度
如何将 UIImage 设置为 UITableView Cell,它根据我在 UILabel 中输入的文本动态计算单元格高度?
如何将UIImage设置为UITableView Cell,根据我在UILabel中输入的文本动态计算单元格高度?