sizeWithFont:constrainedToSize:lineBreakMode:不准确?

sizeWithFont:constrainedToSize:lineBreakMode:似乎没有返回正确的宽度。 执行这些代码后,我看到标签中的部分字符串正在切断,这意味着我要手动添加几个像素的大小。 我错过了什么吗?

我有一个UILabel:

 theLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, LABELWIDTH, LABELHEIGHT)]; theLabel.lineBreakMode = UILineBreakModeWordWrap; theLabel.numberOfLines = 0; [theLabel setFont:[UIFont fontWithName:@"MarkerFelt-Wide" size:16]]; theLabel.textColor = [UIColor blackColor]; theLabel.textAlignment = UITextAlignmentLeft; theLabel.backgroundColor = [UIColor clearColor]; 

我尝试使用以下方法以编程方式修改标签的大小:

 CGSize maximumLabelSize = CGSizeMake(LABELWIDTH, 10000); CGSize expectedLabelSize = [someString sizeWithFont:theLabel.font constrainedToSize:maximumLabelSize lineBreakMode:theLabel.lineBreakMode]; theLabel.text = someString; CGRect newFrame = theLabel.frame; newFrame.size.height = expectedLabelSize.height; newFrame.size.width = newFrame.size.width+50; theLabel.frame = newFrame; 

好吧,首先我要说的是,有一些非常有用的方法来处理你目前没有使用的帧。 例如,你的代码,

 CGRect newFrame = theLabel.frame; newFrame.size.height = expectedLabelSize.height; newFrame.size.width = newFrame.size.width+50; theLabel.frame = newFrame; 

可以用CGGeometry中的函数重写,

 CGFloat widthOffset = 50.0f; theLabel.frame = CGRectOffset(CGRectInset(theLabel.frame, widthOffset, 0.0f), widthOffset / 2.0f, 0.0f); 

但是,如果您的代码按预期工作,则根本不需要执行此操作。 你可以去两条路线,

 [theLabel sizeToFit]; 

或者,这也应该工作,

 theLabel.frame = CGRectMake(theLabel.frame.origin.x, theLabel.frame.origin.y, expectedLabelSize.width, expectedLabelSize.height); 

没有在您之前的代码中更改了标签的宽度以匹配预期的宽度。 注意,你写了newFrame.size.width = newFrame.size.width+50 ,那应该是newFrame.size.width = expectedLabelSize.width