如何计算CATextLayer字符串的边界框?

时间:2012-03-02 18:30:01

标签: iphone objective-c ios cocoa-touch calayer

乍一看,我的问题看起来很简单,但似乎我真的找不到解决方案。 这是它的内容: 我想计算CATextLayer字符串的边界框。 这是我的工作:

CATextLayer *textLayer = [CATextLayer layer];
textLayer.frame = CGRectMake(80, 0.0f, 36.0f, 18.0f);
textLayer.string = @"12";
textLayer.fontSize = [UIFont systemFontSize];
textLayer.foregroundColor = [UIColor whiteColor].CGColor;

NSLog(@"(width,height)=(%f,%f)",
[textLayer.string sizeWithFont:textLayer.font].width,
[textLayer.string sizeWithFont:textLayer.font].height);

问题是输出总是:(宽度,高度)=(8.000000,0.000000)

3 个答案:

答案 0 :(得分:7)

使用sizeWithFont:constrainedToSize:lineBreakMode:

[someString sizeWithFont:yourFont
       constrainedToSize:CGSizeMake(maxWidthYouSpecify, CGFLOAT_MAX)
           lineBreakMode:UILineBreakModeWordWrap];

答案 1 :(得分:7)

从iOS 7开始,使用NSString的{​​{3}}。 boundingRectWithSize:options:attributes:context现已弃用。

CGRect rect = [textLayer.string boundingRectWithSize:textLayer.frame.size options:NSStringDrawingUsesLineFragmentOrigin attributes:nil context:nil];
CGSize size = CGSizeMake(ceilf(rect.size.width), ceilf(rect.size.height));

答案 2 :(得分:1)

这应该可以解决 preferredFrameSize 中的 CATextLayer。代码可以如下:

func createSampleLabel(coordinate origin: CGPoint) {
   let textLayer = CATextLayer()
   textLayer.string = "some string \n with line breaks and long values...."
   textLayer.frame = .init(origin: origin, size: textLayer.preferredFrameSize())
}

enter image description here