Ios UILabel sizeThatFits不起作用
我试图计算UITableViewCell的高度,所以我定义了一个类方法,如下所示Ios UILabel sizeThatFits不起作用,ios,uitableview,uiview,uilabel,Ios,Uitableview,Uiview,Uilabel,我试图计算UITableViewCell的高度,所以我定义了一个类方法,如下所示 + (CGFloat)heightWithText:(NSString *)text { SizingLabel.text = text; [SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)]; return (TOP_MARGIN + SizingLabel.frame.size.height + BOTTOM_M
+ (CGFloat)heightWithText:(NSString *)text
{
SizingLabel.text = text;
[SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)];
return (TOP_MARGIN + SizingLabel.frame.size.height + BOTTOM_MARGIN);
}
我对SizingLabel的定义如下:
+ (void)initialize
{
SizingLabel = [[UILabel alloc] initWithFrame:CGRectZero];
SizingLabel.numberOfLines = 0;
SizingLabel.lineBreakMode = NSLineBreakByWordWrapping;
}
但是,如果我在-heightWithText:方法中插入断点,我会注意到SizingLabel的维度从未改变,因此我得到了一个错误的值。为什么会这样?下面的代码是计算动态文本长度的rect(ios7版本)
+ (CGFloat)heightWithText:(NSString *)text
{
SizingLabel.text = text;
CGSize labelSize = [SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)];
return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN);
}
得到rect后,用它来计算单元格大小
----------------旧版本-------------------
CGSize contentSize = [content sizeWithFont:font
constrainedToSize:CGSizeMake(maxWidth, maxHeight)
lineBreakMode: NSLineBreakByWordWrapping];
在自定义单元格类中执行此操作:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
//Message Label
lbl_name = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 25)];
[lbl_name setFont:[UIFont fontWithName:@"Helvetica" size:16.0f]];
lbl_name.lineBreakMode = UILineBreakModeWordWrap;
lbl_name.numberOfLines = 0;
[lbl_name sizeToFit];
[self.contentView addSubview:lbl_name];
//Time
}
return self;
}
-(void)resizeNameLabel:(NSString *)text
{
CGSize constraint = CGSizeMake(300 , 20000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:16.0f] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
[lbl_name setFrame:CGRectMake(10, 5, 300, MAX(size.height, 25.0f))];//300 Label Width
[lbl_name setText:text];
}
在主课上做这个
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil)
{
cell = (CustomCell *)[[CustomCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
}
[((CustomCell *)cell) resizeNameLabel:text];
return cell;
}
就这样做吧……为了简单地调整具有属性文本的UILabel的大小,我将此类别添加到UILabel中
@implementation UILabel (PAUtils)
- (CGSize)jb_attributedSizeThatFits:(CGSize)size
{
CGRect textRect = [self.attributedText boundingRectWithSize:size options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:nil];
return textRect.size;
}
@end
有两点需要注意:
attributedText
(而只使用text
)时,此方法不考虑numberOfLines
属性boundingRectWithSize
返回点的分数。如果将此方法返回的值用于布局,则可能应该ceilf
宽度和高度如上所述,
sizeThatFits:
(因此sizeToFit
)不能很好地处理UILabel
对象
最好使用首选的textRectForBounds:LimitedToNumberOffline:
方法:
+ (CGFloat)heightWithText:(NSString *)text
{
resizingLabel.text = text;
CGSize labelSize = [resizingLabel textRectForBounds:CGRectMake(0.0, 0.0, LABEL_WIDTH, CGFLOAT_MAX)
limitedToNumberOfLines:0].size; // No limit
return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN);
}
-(CGSize)sizeThatFits:返回文本适合标签的大小。啊,好的,它实际上不调整标签的大小吗?是的,它只返回一个大小。@SEANDAZEISER:允许多行标记?当属性仅应用于文本范围时,经过测试的boundingRectWithSize方法无法正确计算。如果属性应用于文本的所有范围,则其工作正常。但是,由于您在第一次提问时没有提到要将其应用于属性文本,因此您对我的回答投反对票是不公平的(NSDictionary)属性是您设置文本属性的地方。这对我不适用,而且,您应该遵循命名约定,以小写字母开始变量名称(或者
SizingLabel
应该是一个类吗?SizingLabel
一定是一个自动重命名问题。此外,您或任何人都可以编辑帖子;)因为这不起作用。问题出在哪里?基本上,这段代码只使用内置的textRectForBounds:LimitedToNumberOfflines:
,这应该总是有效的。它返回的大小并没有真正反映文本的大小。毕竟,它没有考虑字体。最后,我使用了NSString boundingrect with size:options:attributes:context:
。它考虑了UILabel
字体和参数。您可以在IB中全部设置,然后进行精确测量。这就是为什么我更喜欢它,而不是尝试使用NSString
重新创建标签配置。至于您的问题,是内置方法返回了错误的值还是伴随的调整?而SizingLabel
来自原始问题。如果您相信,当属性字符串不包含NSFontAttributeName
时,它似乎无法正常工作。如果为标签设置字体,则适用于UILabel。@OlgaVogue否,它仅有时有效。sizeThatFits是出了名的童车。
+ (CGFloat)heightWithText:(NSString *)text
{
resizingLabel.text = text;
CGSize labelSize = [resizingLabel textRectForBounds:CGRectMake(0.0, 0.0, LABEL_WIDTH, CGFLOAT_MAX)
limitedToNumberOfLines:0].size; // No limit
return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN);
}