Как рассчитать ограничивающий прямоугольник строки CATextLayer? - PullRequest
7 голосов
/ 02 марта 2012

На первый взгляд мой вопрос выглядит действительно простым, но мне кажется, что я действительно не могу найти решение.Вот что это: я хочу вычислить ограничивающую рамку строки 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 ]

7 голосов
/ 03 января 2014

Начиная с iOS 7, используйте NSString boundingRectWithSize: параметры: атрибуты: контекст . sizeWithFont: constrainedToSize: lineBreakMode: устарела.

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));
7 голосов
/ 02 марта 2012

Использование sizeWithFont:constrainedToSize:lineBreakMode:

[someString sizeWithFont:yourFont
       constrainedToSize:CGSizeMake(maxWidthYouSpecify, CGFLOAT_MAX)
           lineBreakMode:UILineBreakModeWordWrap];
1 голос
/ 14 сентября 2015

// использовать функцию ниже для динамического CATextLayer

func DynamicLableWidth(reason:NSString,cpT:CGPoint,width:CGFloat,reasonLayer:CATextLayer)
{

    //Dynamic CATextLayer with boundingRect
    let font = UIFont(name: "Arial", size: 20)!
    let attributes: [NSString : AnyObject] = [NSFontAttributeName: font]

    var rect:CGRect = reason.boundingRectWithSize(reasonLayer.frame.size, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: attributes, context: nil)

    var size:CGSize = CGSizeMake(rect.size.width, rect.size.height);
    if cpT.x+20+ceil(size.width)+20>width
    {
        reasonLayer.frame = CGRectMake(cpT.x-20-ceil(size.width)+20,  cpT.y-15, ceil(size.width)+20, 20)
    }
    else
    {
        reasonLayer.frame = CGRectMake(cpT.x+20,  cpT.y-15, rect.size.width+20, 20)
    }
}
...