2010-07-24 3 views
9

Ищете, по существу, какао-эквивалент [UILabel adjustsFontSizeToFitWidth].Как я могу указать NSTextField для автоматического определения размера шрифта в соответствии с его текстом?

+0

Я ответил на это для кого-то еще. Вы можете увидеть мой ответ [здесь] (http://stackoverflow.com/questions/2908704/get-nstextfield-contents-to-scale/2911982#2911982). – regulus6633

ответ

1

Я использовал превосходную строчку NS (Attributed) Джерри Кринока + Geometrics (located here) и небольшой метод, подобный следующему. Меня все еще интересует более простой способ.

- (void) prepTextField:(NSTextField *)field withString:(NSString *)string 
{ 
    #define kMaxFontSize 32.0f 
    #define kMinFontSize 6.0f 
    float fontSize = kMaxFontSize; 
    while (([string widthForHeight:[field frame].size.height font:[NSFont systemFontOfSize:fontSize]] > [field frame].size.width) && (fontSize > kMinFontSize)) 
    { 
      fontSize--; 
    } 
    [field setFont:[NSFont systemFontOfSize:fontSize]]; 

    [field setStringValue:string]; 

    [self addSubview:field]; 
} 
2

Не забудьте посмотреть в суперклассах. NSTextField - это своего рода NSControl, и каждый NSControl отвечает на the sizeToFit message.

6

Я решил это, создав подкласс NSTextFieldCell, который переопределяет строковый чертеж. Он смотрит, подходит ли строка, и если она не уменьшает размер шрифта, пока он не подходит. Это может быть сделано более эффективным, и я не знаю, как он будет себя вести, когда cellFrame имеет ширину 0. Тем не менее это было хорошо Enough ™ для моих нужд.

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    NSAttributedString *attributedString; 
    NSMutableAttributedString *mutableAttributedString; 
    NSSize stringSize; 
    NSRect drawRect; 

    attributedString = [self attributedStringValue]; 

    stringSize = [attributedString size]; 
    if (stringSize.width <= cellFrame.size.width) { 
     // String is already small enough. Skip sizing. 
     goto drawString; 
    } 

    mutableAttributedString = [attributedString mutableCopy]; 

    while (stringSize.width > cellFrame.size.width) { 
     NSFont *font; 

     font = [mutableAttributedString 
      attribute:NSFontAttributeName 
      atIndex:0 
      effectiveRange:NULL 
     ]; 
     font = [NSFont 
      fontWithName:[font fontName] 
      size:[[[font fontDescriptor] objectForKey:NSFontSizeAttribute] floatValue] - 0.5 
     ]; 

     [mutableAttributedString 
      addAttribute:NSFontAttributeName 
      value:font 
      range:NSMakeRange(0, [mutableAttributedString length]) 
     ]; 

     stringSize = [mutableAttributedString size]; 
    } 

    attributedString = [mutableAttributedString autorelease]; 

drawString: 
    drawRect = cellFrame; 
    drawRect.size.height = stringSize.height; 
    drawRect.origin.y += (cellFrame.size.height - stringSize.height)/2; 
    [attributedString drawInRect:drawRect]; 
} 
+0

Чтобы шрифт был правильно центрирован по вертикали, следующая строка нужна прямо перед 'while':' [mutableAttributedString removeAttribute: @ "NSOriginalFont" range: NSMakeRange (0, [mutableAttributedString length])]; ' – DarkDust

Смежные вопросы