2010-09-08 2 views
20

Возможно ли получить окончательный размер шрифта после автонастройки? (Свойство adjustsFontSizeToFitWidth установлены в YES, и размер шрифта текста в настоящее время усаживается, чтобы вписаться в ярлык)Как получить автоматический размер шрифта UILabel (UITextView)?

Я подклассы drawTextInRect в UILabel поставить градиент по тексту, но размер градиента должен быть таким же, как размер шрифта. Я не могу получить правильный размер скорректированного шрифта ... Возможно ли это?

//draw gradient 

    CGContextSaveGState(myContext); 
     CGGradientRef glossGradient; 
     CGColorSpaceRef rgbColorspace; 
     size_t num_locations = 2; 
     CGFloat locations[2] = { 0.0, 1.0 }; 
     CGFloat components[8] = { 1, 1, 1, 0.25, // BOTTOM color 
      1, 1, 1, 0.12 }; // UPPER color 

    //scale and translate so that text would not be rotated 180 deg wrong 
     CGContextTranslateCTM(myContext, 0, rect.size.height); 
     CGContextScaleCTM(myContext, 1.0, -1.0); 

//create mask 
     CGImageRef alphaMask = CGBitmapContextCreateImage(myContext); 
     CGContextClipToMask(myContext, rect, alphaMask); 

     rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
     glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

    //gradient should be sized to actual font size. THIS IS THE PROBLEM - EVEN IF FONT IS AUTO ADUJSTED, I AM GETTING THE SAME ORIGINAL FONT SIZE!!! 

     CGFloat fontCapHeightHalf = (self.font.capHeight/2)+5; 
      CGRect currentBounds = rect; 
     CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)-fontCapHeightHalf); 
     CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)+fontCapHeightHalf); 

     CGContextDrawLinearGradient(myContext, glossGradient, topCenter, midCenter, 0); 

     CGGradientRelease(glossGradient); 
     CGColorSpaceRelease(rgbColorspace); 
    CGContextRestoreGState(myContext); 
+1

возможно дубликат [Как рассчитать размер UIFont, когда текст этикетки ограничен вниз, чтобы соответствовать ширине?] (HTTP: // stackoverflow.com/questions/1385338/how-to-calculate-the-size-of-a-uifont-when-text-in-label-is-constrained-down-to-f) –

+1

Да, спасибо, что указал мне в правильном направлении. Я сам не нашел его, прежде чем публиковать свой вопрос. –

ответ

17

Вы не можете получить размер напрямую, но вы можете вычислить его достаточно легко с помощью these functions:

CGFloat actualFontSize; 
[label.text sizeWithFont:label.font 
      minFontSize:label.minimumFontSize 
      actualFontSize:&actualFontSize 
       forWidth:label.bounds.size.width 
      lineBreakMode:label.lineBreakMode]; 
+8

Устаревший в iOS 7 без альтернативы. – openfrog

+0

@openfrog Я разместил здесь альтернативу, которая будет работать на iOS 7 - http://stackoverflow.com/a/20829315/1445366, это не так просто, но она выполняет свою работу. –

+0

@openfrog -sizeWithAttributes: это альтернатива. https://developer.apple.com/library/ios/documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html#//apple_ref/occ/instm/NSString/sizeWithAttributes: –

2
CGSize size = [label.text sizeWithFont:label.font minFontSize:10 actualFontSize:&actualFontSize forWidth:200 lineBreakMode:UILineBreakModeTailTruncation]; 
+2

Устаревший в iOS 7. – openfrog

+1

Означает ли это, что с Swift нет решения? – Narwhal

2

Мой ответ не очень полезно для первоначального вопроса, но я end здесь каждый раз, когда я ищу, как получить размер шрифта после автоматической настройки. Прежде всего, sizeWithFont устарел в iOS 7.0, как мы все знаем, поэтому нам нужно найти другое решение.

Мое решение подходит для моего случая, в котором у меня есть две метки, одна с большим количеством ограничений и больше текста, чем вторая.

Вот шаг за шагом пример:

  • две этикетки с одинаковой шириной и разной длиной текста:

enter image description here

Я хочу, во время выполнения, то размер шрифта основной uilabel для изменения размера, а второй - для того же размера шрифта.

  • уменьшить размер обеих меток, так что текст первого соответствует кадр, в данном случае 12 для обоих:

enter image description here

enter image description here

  • после установки ограничений позиции (в моем примере метки остаются в центре родительского представления), обновите кадры обоих меток так, чтобы они соответствовали Текст именно:

enter image description here

  • добавить Aspect Ratio ограничения между шириной и высотой до двух меток и ограничения ширины между основной этикеткой и родительским видом:

enter image description here

enter image description here

  • добавить ограничение ширины со второй этикетки на основной этикетке:

enter image description here

enter image description here

  • теперь вы можете установить размер шрифта меток, как вы хотите:

enter image description here

Вот скриншот Simulator:

enter image description here

первая метка изменяется в зависимости от размера экрана и размер шрифта регулируется, следовательно. Размер шрифта второй метки одинаковый из-за ограничения ширины и параметров шрифта, указанных в последнем изображении.

Это всего лишь пример, который призван продемонстрировать «трюк» за моим решением: привязать фреймы меток к исходному размеру шрифта, чтобы во время выполнения он был таким же. Я полагаю, что этот метод можно было бы повторно адаптировать к ярлыкам с переменным размером, просто добавив ограничения между метками после того, как вы установили текст и изменили размер кадра в соответствии с текстом.

0

Это простое решение отлично работает для одной строки UILabel:

//myLabel - initial label 

UILabel *fullSizeLabel = [UILabel new]; 
fullSizeLabel.font = myLabel.font; 
fullSizeLabel.text = myLabel.text; 
[fullSizeLabel sizeToFit]; 

CGFloat actualFontSize = myLabel.font.pointSize * (myLabel.bounds.size.width/fullSizeLabel.bounds.size.width); 

//correct, if new font size bigger than initial 
actualFontSize = actualFontSize < myLabel.font.pointSize ? actualFontSize : myLabel.font.pointSize; 
Смежные вопросы