gpt4 book ai didi

ios - 在没有 contentView 框架的情况下计算 UITableViewCell 高度的最佳方法

转载 作者:可可西里 更新时间:2023-11-01 02:59:06 24 4
gpt4 key购买 nike

总结

鉴于我们并不总是知道单元格的框架或其内容 View 将是什么(由于编辑、旋转、附属 View 等),计算高度的最佳方法是什么在 tableView:heightForRowAtIndexPath: 中,当单元格包含可变高度的文本字段或标签时?

我的一个 UITableViewController 包含以下演示文稿:带有 UITextView 的 UITableViewCell。

UITextView 应与 UITableViewCell 的宽度和高度相同。

enter image description here

我创建了 UITableViewCell 子类,然后用 UITextView 初始化它(UITextView 是我的 UITableViewController 的私有(private)字段)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
static NSString *CellIdentifier = @"TextViewCell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[BTExpandableTextViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier textView:_notesTextView] autorelease];
}
return cell;
}

我在我的 UITableViewCell 子类中实现了以下方法:

- (void)layoutSubviews{
[super layoutSubviews];
CGFloat height = [textView.text sizeWithFont:textView.font constrainedToSize:CGSizeMake(textView.frame.size.width, MAXFLOAT)].height + textView.font.lineHeight;
textView.frame = CGRectMake(0, 0, self.contentView.frame.size.width, (height < textView.font.lineHeight * 4) ? textView.font.lineHeight * 4 : height);
[self.contentView addSubview:textView];
}

当然,我实现了以下 UITableViewDataSource 方法(看!我正在使用 self.view.frame.size.width(但实际上我需要 UITableViewCell contentView 框架宽度):

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath{

CGFloat height = [_notesTextView.text sizeWithFont:_notesTextView.font
constrainedToSize:CGSizeMake(self.view.frame.size.width, MAXFLOAT)].height;
CGFloat groupedCellCap = 20.0;
height += groupedCellCap;

if(height < [BTExpandableTextViewCell minimumTextViewHeightWithFont:_notesTextView.font]){
height = [BTExpandableTextViewCell minimumTextViewHeightWithFont:_notesTextView.font];
}
return height;
}

我还实现了下面的方法(这不是很重要,但我还是贴出来,只是为了解释单元格的高度是动态的,它会在 UITextView 中更改文本后收缩或扩展)

 - (void)textViewDidChange:(UITextView *)textView{
CGFloat height = [_notesTextView.text sizeWithFont:_notesTextView.font
constrainedToSize:CGSizeMake(_notesTextView.frame.size.width, MAXFLOAT)].height;
if(height > _notesTextView.frame.size.height){
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
}

现在,我的问题是:加载 View 后,UITableViewController 按以下顺序调用方法:(为了简化,我将删除一些,如 titleForHeaderInSection 等)

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath{

只有那时

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

看!我应该在 cellForRowAtIndexPath 之前返回正确的 UITableViewCell 高度!这意味着:我不知道 UITableViewCell contentView 框架。而且我无法以编程方式获取它。

这个宽度可以是以下之一:

  1. iPhone 普通表,纵向
  2. iPhone 普通表,横向
  3. iPhone 分组表格,纵向
  4. iPhone 分组表格,横向
  5. iPad 也一样(另外 4 个值)

并且不要忘记,由于 UITableViewCell accessoryType 或 UITableView 编辑状态,contentView 框架可能会更小。 (例如,如果我们有 UITableViewCell 和任何高度的多行 UILabel 在任何编辑状态和任何 accessoryView)

所以这个问题是根本性的:我只是无法获得用于约束的单元格 contentView 框架宽度,因为我应该在单元格布局 contentView 之前返回此高度。 (顺便说一句,这是非常合乎逻辑的)但是这个 contentView 框架真的很重要。

当然有时我可以准确地知道这个宽度并“硬编码”它(比如:UITableViewCellAccessoryDisclosureIndicator 的宽度是20px,tableView 不能处于编辑状态,那么我可以写self.view.frame.size.width - 20 就完成了)!或者有时 contentView 等于 UITableViewController 的 View 框架!

有时我在 -tableView:heightForRowAtIndexPath: 方法中使用 self.view.frame.width ..(就像现在一样,它工作得很好,但由于分组的 UITableView 而不是完美的,应该减去一些常量值,并且它们2 个设备 * 2 个方向不同)

有时我在 UITableViewCell 中有一些#defined 常量(如果我确切地知道宽度)...

有时我会使用一些虚拟的预分配 UITableViewCell(这很愚蠢,但有时非常优雅且易于使用)...

但我不喜欢这些。

最好的决定是什么?也许我应该创建一些辅助类,它将使用这些参数进行初始化:附件 View 、设备方向、设备类型、 TableView 编辑状态、 TableView 样式(普通、分组)、 Controller View 框架和其他一些,将包含一些常量(如分组 tableView 偏移量等)并使用它来查找预期的 UITableViewCell contentView 宽度? ;)

谢谢

最佳答案

TableView 使用 tableView:heightForRowAtIndexPath: 方法在创建任何 UITableViewCell 单元格之前确定其 contentSize。如果您停下来仔细想想,这是有道理的,因为您对 UIScrollView 做的第一件事就是设置它的 contentSize。我以前遇到过类似的问题,我发现最好有一个辅助函数,它可以将内容放入 UITableViewCell 并预测该 UITableViewCell 的高度。所以我想你会想要创建某种数据结构,将文本存储在每个 UITableViewCell 中,一个以 NSIndexPaths 作为键、文本作为值的 NSDictionary 会做得很好。这样,您无需引用 UITableViewCell 即可找到所需文本的高度。

关于ios - 在没有 contentView 框架的情况下计算 UITableViewCell 高度的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11103238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com