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
。