Как получить автоматический размер шрифта UILabel (UITextView)?

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

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

//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); 

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

 CGFloat actualFontSize; [label.text sizeWithFont:label.font minFontSize:label.minimumFontSize actualFontSize:&actualFontSize forWidth:label.bounds.size.width lineBreakMode:label.lineBreakMode]; 
 CGSize size = [label.text sizeWithFont:label.font minFontSize:10 actualFontSize:&actualFontSize forWidth:200 lineBreakMode:UILineBreakModeTailTruncation]; 

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

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

Вот пошаговый пример:

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

введите описание изображения здесь

Во время выполнения я хочу, чтобы размер шрифта основной uilabel был изменен, а второй – с тем же размером шрифта.

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

введите описание изображения здесь

введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

введите описание изображения здесь

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

введите описание изображения здесь

введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

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

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

Это простое решение отлично подходит для однолинейного 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; 
  • Выбор даты для веб-приложения iPhone
  • Сравнение JSON Parser для Objective-C (JSON Framework, YAJL, TouchJSON и т. Д.)
  • Интерфейс UIScrollViewBegan
  • CALayer: добавить границу только с одной стороны
  • Рисование повернутого текста с помощью NSString drawInRect
  • Декодирование символов UTF8 в Objective C
  • как писать в режиме добавления для текстового файла
  • Текст кривой на существующем круге
  • Как отправлять объекты в файлах NIB на передний / задний?
  • UITableView dequeueReusableCellWithIdentifier Theory
  • Iphone SDK отклоняет Modal ViewControllers на ipad, щелкнув за его пределами
  • Interesting Posts

    SSH Обратный тоннель

    Как установить значение null в org.json.JSONObject в java?

    Шаблон T4 для создания имен

    FFmpeg в партии для цикла для MP3 Продолжительность

    Что такое команда Linux, чтобы узнать информацию об оборудовании?

    Как применять встроенный и / или внешний CSS, загружаемый динамически с помощью jQuery

    Параллельные streamи, коллекторы и безопасность streamов

    Загрузка изображения из CoreData на cellForRowAtIndexPath замедляет прокрутку

    Зависимость игнорируется из-за конфликта Android-студия

    Почему fmt.Println внутри goroutine не печатает строку?

    Нечувствительная к регистру строка в виде ключа HashMap

    В C ++ какие категории (lvalue, rvalue, xvalue и т. Д.) Могут выражать выражения, которые производят временные classы типа classа?

    Как сбросить пароль root root linux

    Почему проверка равноценности одной переменной по многим значениям всегда возвращает true?

    Внешний жесткий диск неправильно распознан как внутренний жесткий диск

    Давайте будем гением компьютера.