Реплицируйте возвращение указателя actualFontSize в устаревшем формате sizeWithFont:minFontSize:actualFontSize, чтобы получить изменение размера шрифта?

Так,

в sizeWithFont:minFontSize:actualFontSize, мы передаем указатель для actualFontSize, который затем может быть использован для сокращения шрифта внутри метки. Как в:

[s sizeWithFont:self.font
                minFontSize:minimumScaleFactor
                actualFontSize:&actualFontSize
                    forWidth:width
                lineBreakMode:lineBreakMode];

Так что теперь мы можем сделать self.frame.font.pointSize = actualSize изменить размер шрифта. Мой вопрос: теперь, когда sizeWithFont устарела, как мне вернуть этот указатель?

В основном, рекомендуемый метод его замены boundingRectWithSize:

[s boundingRectWithSize:CGSize(width,CGFLOAT_MAX)
                options:(NSStringDrawingUsesLineFragmentOrigin)
                attributes://An NSDictionary with font
                context:nil];

Но, как вы можете видеть, он только возвращает размер. Я думал сделать что-то вроде:

changeInFontSize = (newSize.height - oldSize.height) + (newSize.width - oldSize.width)
                   -------------------------------------------------------------------
                                                  2

Но это не дает мне того ответа, который я хочу. Может ли кто-нибудь помочь мне с этим? Если быть точным - мне нужна разница в размере шрифта, чтобы изменить текущий размер шрифта!

1 ответ

Решение

Проблема в том, что sizeWithFont Метод уменьшает размер шрифта по мере необходимости. Так что, если функция использовала меньший размер шрифта, как узнать, какой размер она использовала? Это actualFontSize за!! Из документации:

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

Новый рекомендуемый метод boundingRectWithSize не уменьшает размер шрифта. Поэтому, если функция НЕ уменьшает размер шрифта, то есть она будет использовать размер, указанный в attributes, нет необходимости возвращать фактический используемый размер (потому что это именно тот размер, который вы указали, следовательно, вы уже знаете его).

РЕДАКТИРОВАТЬ:
Если вы хотите рассчитать размер шрифта, необходимый для размещения в некотором предопределенном ограничивающем прямоугольнике, вам необходимо протестировать несколько размеров точек и рассчитать тот, который подходит лучше всего. Посмотрите эту ссылку для некоторых примеров (последний ответ по ссылке выглядит интересным для оптимизации эффективности)

Другие вопросы по тегам