如何获取 UITableViewCell 中标签的高度?
How to get height of label inside UITableViewCell?
假设我有一个简单的 tableViewCell
,只有一个视图 (UILabel
),tableView
有 10 行,不同位置的 label
的文本从 1到 3 行,现在 cellForRowAtIndexPath
cellForRowAtIndexPath{
[MyCell* cell = _tableView.dequeueReusableCellWithIdentifier:@"MyCell"];
cell.label.text = [stringArray objectAtIndex:indexPath.row];
}
现在我想将 cornerRadius
添加到与该标签高度成比例的 label
(比如角半径是标签高度的一半)
label.layer.cornerRadius = label.frame.size.height/2;
现在我的问题是我在哪里可以为标签设置这个角半径?
- 我尝试在
cellForRowAtIndexPath
中设置,但我得到的高度值不正确
我试图像这样覆盖 MyCell class 中的 layoutForSubViews
。
-(void)layoutSubviews{
[super layoutSubviews];
self.label.layer.cornerRadius = self.label.frame.size.height/2;
}
但我仍然得到错误的身高值
我尝试在 -willDisplayCell
从 tableView 回调时执行此操作,但高度仍然错误
唯一似乎有效的方法是覆盖单元格的 drawRect
并分配 cornerRadius
。这是唯一的方法吗?
您也可以尝试使用 [cell.label sizeToFit];
并在此之后访问框架,例如在 cellForRowAtIndex 路径中。
但是大小不合适会导致布局错误。
此外,@DSDharma 注释应该很有用,但您需要在 UITableViewCell 子类中重写 - (void) layoutSubviews
。那应该有效。
您可以在 sizeForItemAtIndexPath 中获取 UITableViewCell 标签的正确高度。
使用下面的代码
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
NSMutableDictionary *currentObject = [yourMutableArray objectAtIndex:indexPath.row];
NSString *datum = [currentObject valueForKey:@"yourKeyName"];
CGSize size = [datum boundingRectWithSize:CGSizeMake(self.view.bounds.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont fontWithName:@"yourFontFamily" size:16]} context:nil].size;
return size;
}
使用下面的代码获取标签高度。
- (CGFloat)getLabelHeight:(UILabel*)label
{
CGSize constraint = CGSizeMake(label.frame.size.width, 999);
CGSize size;
NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGSize boundingBox = [label.text boundingRectWithSize:constraint
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:label.font}
context:context].size;
size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));
return size.height;
}
要计算大小 sizeWithFont constrainedToSize:lineBreakMode:
使用此方法。
示例:
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];
//update label with new Height
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;
并设置 CornerRadius
为 newFrame
值
假设我有一个简单的 tableViewCell
,只有一个视图 (UILabel
),tableView
有 10 行,不同位置的 label
的文本从 1到 3 行,现在 cellForRowAtIndexPath
cellForRowAtIndexPath{
[MyCell* cell = _tableView.dequeueReusableCellWithIdentifier:@"MyCell"];
cell.label.text = [stringArray objectAtIndex:indexPath.row];
}
现在我想将 cornerRadius
添加到与该标签高度成比例的 label
(比如角半径是标签高度的一半)
label.layer.cornerRadius = label.frame.size.height/2;
现在我的问题是我在哪里可以为标签设置这个角半径?
- 我尝试在
cellForRowAtIndexPath
中设置,但我得到的高度值不正确 我试图像这样覆盖 MyCell class 中的
layoutForSubViews
。-(void)layoutSubviews{ [super layoutSubviews]; self.label.layer.cornerRadius = self.label.frame.size.height/2; }
但我仍然得到错误的身高值
我尝试在
-willDisplayCell
从 tableView 回调时执行此操作,但高度仍然错误
唯一似乎有效的方法是覆盖单元格的 drawRect
并分配 cornerRadius
。这是唯一的方法吗?
您也可以尝试使用 [cell.label sizeToFit];
并在此之后访问框架,例如在 cellForRowAtIndex 路径中。
但是大小不合适会导致布局错误。
此外,@DSDharma 注释应该很有用,但您需要在 UITableViewCell 子类中重写 - (void) layoutSubviews
。那应该有效。
您可以在 sizeForItemAtIndexPath 中获取 UITableViewCell 标签的正确高度。
使用下面的代码
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
NSMutableDictionary *currentObject = [yourMutableArray objectAtIndex:indexPath.row];
NSString *datum = [currentObject valueForKey:@"yourKeyName"];
CGSize size = [datum boundingRectWithSize:CGSizeMake(self.view.bounds.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont fontWithName:@"yourFontFamily" size:16]} context:nil].size;
return size;
}
使用下面的代码获取标签高度。
- (CGFloat)getLabelHeight:(UILabel*)label
{
CGSize constraint = CGSizeMake(label.frame.size.width, 999);
CGSize size;
NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGSize boundingBox = [label.text boundingRectWithSize:constraint
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:label.font}
context:context].size;
size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));
return size.height;
}
要计算大小 sizeWithFont constrainedToSize:lineBreakMode:
使用此方法。
示例:
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];
//update label with new Height
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;
并设置 CornerRadius
为 newFrame
值