2012-05-12 2 views
0

Я искал весь стек, чтобы ответить на этот вопрос, хотя в этой теме есть много вопросов, по-видимому, нет ответа на вопрос, по крайней мере, не для меня.Автоматическое расширение UIView и CGPath в соответствии с текстом ядра

У меня есть пользовательский UIView фиксированного размера в раскадровке (в ячейке прототипа). Я подклассифицировал UIView для него и написал метод drawRect. Это в основном собирает отформатированную строку, то я рисую это так:

// now for the actual drawing 
CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetShadowWithColor(context, 
          CGSizeMake(0, 1), 
          0, 
          [UIColor whiteColor].CGColor); 

CGMutablePathRef path = CGPathCreateMutable(); //1 
CGPathAddRect(path, NULL, self.bounds); 

// flip the coordinate system 
CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
CGContextTranslateCTM(context, 0, self.bounds.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

CTFramesetterRef framesetter = 
CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)stringToDraw); //3 

CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL); 


CTFrameDraw(frame, context); //4 

Это нормально и работает, и если я по умолчанию размер достаточно большой, он будет обрабатывать несколько строк текста.

CGPath использует все UIView, это прекрасно/желательно.

Я хочу, чтобы ширина CGPath была фиксированной, но я хочу, чтобы высота расширялась, чтобы разместить практически неограниченное количество текста, прямо сейчас оно просто отключается (из-за того, что путь/представление не является достаточно большим, чтобы охватить его)

Я пробовал играть с CTFramesetterSuggestFrameSizeWithConstraints безрезультатно. Может кто-то, пожалуйста, помогите мне разработать какой-то код, который достигнет того, что мне нужно сделать?

ответ

0

Зная строку рисовать и шрифт использовать, вы всегда можете получить оценки от

CGSize boundingSize = CGSizeMake(self.bounds.size.width, CGFLOAT_MAX); 
CGSize requiredSize = [yourText sizeWithFont:yourFont 
          constrainedToSize:boundingSize 
           lineBreakMode:UILineBreakModeWordWrap]; 
CGFloat requiredHeight = requiredSize.height; 

Вы там получить высоту и можете использовать его в другом месте ...

+0

Спасибо @nicolasthenoz, хотя другая причина, по которой я нуждался в нем для расширения, чтобы соответствовать, был, потому что я планирую позиционировать другие элементы сразу после/под текстом. Также моя ячейка таблицы также расширила бы эту большую, больше, чем требуется для текста. –

+0

'sizeWithFont' не будет работать точно с CoreText, по крайней мере, не во всех случаях. –

0

Вот что вы что это использует API-интерфейсы CoreText и вернет правильную высоту в отличие от ответа sizeSithFont, который неверен.

// Measure the height required to display the attr string given a known width. 
// This logic returns a height without an upper bound. Not thread safe! 

- (NSUInteger) measureHeightForWidth:(NSUInteger)width 
{ 
    NSAssert(self.isDoneAppendingText == TRUE, @"isDoneAppendingText"); 

    NSAssert(self.attrString, @"attrString"); 

    CFMutableAttributedStringRef attrString = self.attrString; 
    CFRange stringRange = self.stringRange; 

    CGFloat measuredHeight = 1.0f; 

    // Create the framesetter with the attributed string. 

    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString); 

    if (framesetter) { 
    CFRange fitRange; 
    CGSize constraints = CGSizeMake(width, CGFLOAT_MAX); // width, height : CGFLOAT_MAX indicates unconstrained 

    CGSize fontMeasureFrameSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, stringRange, (CFDictionaryRef)NULL, constraints, &fitRange); 

    // Note that fitRange is ignored here, we only care about the measured height 

    measuredHeight = fontMeasureFrameSize.height; 

    CFRelease(framesetter); 
    } 

    return (NSUInteger) ceil(measuredHeight); 
} 
Смежные вопросы