我的应用在 iOS 7 上有问题
我使用以下方法计算我的标签尺寸:
CGSize constraint = CGSizeMake(275, 141);
CGSize size;
size = [_rtLabelQuestion.plainText sizeWithFont:[UIFont fontWithName:@"KGWhattheTeacherWants" size:intFont] constrainedToSize:constraint lineBreakMode:NSLineBreakByTruncatingTail];
然后使用以下方法放置我的标签框:
_rtLabelQuestion.frame = CGRectMake(aLabelTemp.frame.origin.x, aLabelTemp.frame.origin.y, size.width + 2 , size.height + 10);
但是在 iOS 7 上,我的 CGSize
的宽度和高度总是小于 intFont 像素,我一直在研究这 2 天,但没有解决方案,请帮忙,谢谢!
最佳答案
您传递给 -[UIFont fontWithName:size:]
的 size:
是字体的磅值。
您从 -[NSString sizeWithFont:constrainedToSize:lineBreakMode:]
返回的大小是字符串中布局字形的实际大小。
如果您希望给定的字符串具有特定的大小,在特定的面上,您可能必须执行牛顿法类型迭代,在该迭代中更改要传递的点大小,直到布局大小接近足够你想要的。 (我不希望这样的操作在一般情况下会很快,顺便说一句。)它可能看起来像这样:
NSString* theString = @"FOOBAR";
CGSize constraint = CGSizeMake(275, 12);
CGFloat desiredHeight = 12.0;
CGFloat pointSize = desiredHeight;
CGFloat actualHeight = 0;
do {
CGSize size = [theString sizeWithFont: [UIFont fontWithName:@"Helvetica" size: pointSize] constrainedToSize: constraint lineBreakMode:NSLineBreakByTruncatingTail];
actualHeight = size.height;
CGFloat ratio = actualHeight / desiredHeight;
pointSize = pointSize / ratio;
} while (fabs(actualHeight - desiredHeight) > 0.01);
PS:-[NSString sizeWithFont:constrainedToSize:lineBreakMode:]
在 iOS7 中已弃用。编译器告诉我使用 -boundingRectWithSize:options:attributes:context:]
代替。使用新的推荐方法,它可能看起来像这样:
NSString* theString = @"FOOBAR";
CGSize constraint = CGSizeMake(275, 12);
CGFloat desiredHeight = 12.0;
CGFloat pointSize = desiredHeight;
CGFloat actualHeight = 0;
NSStringDrawingContext* ctx = [[NSStringDrawingContext alloc] init];
do {
CGRect br = [theString boundingRectWithSize: constraint options: 0 attributes: @{ NSFontAttributeName : [UIFont fontWithName:@"Helvetica" size: pointSize] } context:ctx];
actualHeight = br.size.height;
CGFloat ratio = actualHeight / desiredHeight;
pointSize = pointSize / ratio;
} while (fabs(actualHeight - desiredHeight) > 0.01);
关于iOS 7 为我提供了不同的 CGSize 宽度和高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18894405/