Подтвердить что ты не робот

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

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

Я подклассифицирую 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);
4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Вот скриншот симулятора:

enter image description here

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

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

Ответ 4

Это простое решение отлично работает для однолинейного 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;