IOS 7 - шрифт размера UITextView для отображения всего текста (без прокрутки)

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

Метод 'sizeWithFont' устарел, и я хочу обеспечить лучшие практики, и XCode говорит использовать 'boundingRectWithSize', но не уверен, как использовать это, чтобы уменьшить шрифт вниз, чтобы весь текст соответствовал.

Любые предложения? И нет, я не могу использовать UILabel вместо этого. Мне нужно, чтобы текст был вертикально выровнен вверху, а UILabel этого не делает.

Работала с Pre-iOS 7:

CGFloat fontSize;
CGFloat minSize;
if([deviceType isEqualToString:@"iPad"] || [deviceType isEqualToString:@"iPad Simulator"]){
    fontSize = 40;
    minSize = 15;
}
else{
    fontSize = 18;
    minSize = 8;
}
while (fontSize > minSize)
{
    CGSize size = [quote sizeWithFont:[UIFont fontWithName:@"Interstate" size:fontSize] constrainedToSize:CGSizeMake(newView.frame.size.width, 10000)];

    if (size.height <= newView.frame.size.height) break;

    fontSize -= 1.0;
}

Ответ 1

Решение 1

Ваша проблема может быть решена путем простой замены sizeWithFont: constrainedToSize: на:

boundingRectWithSize:CGSizeMake(newView.frame.size.width, FLT_MAX)
                options:NSStringDrawingUsesLineFragmentOrigin
             attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Interstate" size:fontSize]}
                context:nil];

Решение 2

Метод sizeThatFits может использоваться для решения этой проблемы следующим образом:

while (fontSize > minSize &&  [newView sizeThatFits:(CGSizeMake(newView.frame.size.width, FLT_MAX))].height >= newView.frame.size.height ) {
    fontSize -= 1.0;
    newView.font = [tv.font fontWithSize:fontSize];
}

Я надеюсь, что одно из этих решений решит вашу проблему. Ура!

Ответ 2

Мне пришлось сделать то же самое, но затем с программно добавленными ограничениями AutoLayout (NSLayoutConstraint). Из-за ограничений contentSize в течение большей части времени было неправильным, что вызывало прокрутку UITextView:/Чтобы все еще получить правильный размер шрифта, я в итоге просто создал новый UITextView ради того, чтобы сделать хороший "пробное тестирование и тестирование ошибок".

Довольно просто, но, как и все, что вам просто нужно придумать:)

NSInteger fontSize = 200;

UITextView *testTextView = [[UITextView alloc] init];
testTextView.text = self.myRealTextView.text;
testTextView.font = [UIFont fontWithName:@"AldotheApache" size:fontSize];
while ([testTextView sizeThatFits:(CGSizeMake(self.myRealTextView.frame.size.width, FLT_MAX))].height >= self.myRealTextView.frame.size.height ) {
    fontSize -= 0.5;
    testTextView.font = [UIFont fontWithName:@"AldotheApache" size:fontSize];
}

NSLog(@"Correct font size is: %ld",(long)fontSize);

self.myRealTextView.font = [UIFont fontWithName:@"AldotheApache" size:fontSize];

Ответ 3

Попробуйте UITextView sizeThatFits. Вероятно, вы можете использовать его следующим образом:

//Set  text content of UITextView
//...

while (fontSize > minSize) {

   // Set font size of UITextView

   CGSize size = [textView sizeThatFits:(CGSizeMake(textView.frame.size.width, FLT_MAX)];

   if (size.height <= newView.frame.size.height) break;

   fontSize -= 1.0;

}

Ответ 4

UITextView является подклассом UIScrollView → , поэтому вы можете проверить contentSize прокручиваемой области после того, как вы установите текст или шрифт в textView.

textView.text = quote;
do
{
    textView.font = [UIFont fontWithName:@"Interstate" size:fontSize];
    [textView layoutIfNeeded];
    if (textView.contentSize.height <= newView.frame.size.height) {
        break;
    }
    fontSize -= 1.0;
} while (fontSize >= minSize);

Это должно сработать... Вероятно, это сработало бы даже без [textView layoutIfNeeded].