在 cellForRow 中设置一个浮点数 .. 并在 heightForRow 中设置 return
Set a float in cellForRow.. and return it in heightForRow
我有一个带有标签的自定义单元格。我想要做的是在 cellForRow...
中制作标签 sizeToFit
并将标签高度传递给名为 labelHeight
的变量。然后在 heightForRow...
我想 return labelHeight
.
问题是,它 return 的高度为 0。这是我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
[customCell.label sizeToFit];
self.labelHeight = customCell.label.frame.size.height;
...
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
return self.labelHeight;
}
我认为没有很好的解决方案,因为 heightForRowAtIndexPath
在 cellForRowAtIndexPath
之前被调用。
你可以:
通过计算具有特定字体(样式和大小)的文本数量将占用的大小来计算 heightForRowAtIndexPath
上单元格的高度:
CGSize size = [string sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
或者您可以模拟整个视图以获得更精确的结果(但计算成本会更高)或
- 在
cellForRowAtIndexPath
上计算单元格高度后重新加载表格视图
如果您需要计算 heightForRowAtIndexPath 最简单的方法(尽管感觉效率低下)是使用 heightForRow 调用 cellForRowAtIndexPath... 然后在 table 上重新加载调用,这将再次调用 cellForRow.. . 由于单元格的双重创建,这感觉很脏,如果您能够使用动态常量简化已知常量的高度计算因子,这可能会更有效但代码更多。例如
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath(NSIndexPath *)indexPath{
NSString *string = self.objects[indexPath.row];
NSDictionary *textAttributes = nil; //attributes here
return self.someButton.frame.size.height +
self.someSwitch.frame.size.height +
[string boundingRectWithSize:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:textAttributes
context:nil].size.height;
}
如果您能够支持 iOS 8+ 并且正在使用自动版式,则更好的解决方案是将 table 视图上的 -estimatedRowHeight
属性 设置为一个非零值,那么单元格上的 UILayoutConstraints 将能够为您计算。这是对 iOS8 中 tableViews 的一个非常受欢迎的新补充,并且在其中一个 WWDC 视频中进行了描述。但如果单元格上没有自动布局,它就无法工作。
我有一个带有标签的自定义单元格。我想要做的是在 cellForRow...
中制作标签 sizeToFit
并将标签高度传递给名为 labelHeight
的变量。然后在 heightForRow...
我想 return labelHeight
.
问题是,它 return 的高度为 0。这是我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
[customCell.label sizeToFit];
self.labelHeight = customCell.label.frame.size.height;
...
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
return self.labelHeight;
}
我认为没有很好的解决方案,因为 heightForRowAtIndexPath
在 cellForRowAtIndexPath
之前被调用。
你可以:
通过计算具有特定字体(样式和大小)的文本数量将占用的大小来计算
heightForRowAtIndexPath
上单元格的高度:CGSize size = [string sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}]; CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
或者您可以模拟整个视图以获得更精确的结果(但计算成本会更高)或
- 在
cellForRowAtIndexPath
上计算单元格高度后重新加载表格视图
如果您需要计算 heightForRowAtIndexPath 最简单的方法(尽管感觉效率低下)是使用 heightForRow 调用 cellForRowAtIndexPath... 然后在 table 上重新加载调用,这将再次调用 cellForRow.. . 由于单元格的双重创建,这感觉很脏,如果您能够使用动态常量简化已知常量的高度计算因子,这可能会更有效但代码更多。例如
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath(NSIndexPath *)indexPath{
NSString *string = self.objects[indexPath.row];
NSDictionary *textAttributes = nil; //attributes here
return self.someButton.frame.size.height +
self.someSwitch.frame.size.height +
[string boundingRectWithSize:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:textAttributes
context:nil].size.height;
}
如果您能够支持 iOS 8+ 并且正在使用自动版式,则更好的解决方案是将 table 视图上的 -estimatedRowHeight
属性 设置为一个非零值,那么单元格上的 UILayoutConstraints 将能够为您计算。这是对 iOS8 中 tableViews 的一个非常受欢迎的新补充,并且在其中一个 WWDC 视频中进行了描述。但如果单元格上没有自动布局,它就无法工作。