2010-01-10 4 views

ответ

2

Это свойство доступно только на UITextFields. Для этого в UITextView вам придется постоянно следить за текстом и вручную изменять размер шрифта по мере его изменения.

+0

Ах, есть ли какой-нибудь образец кода, который делает это? Я огляделся и ничего не нашел. Спасибо! –

+0

Я не знаю ни одного образца кода; Я никогда не слышал, чтобы кто-то пытался это сделать раньше. –

8

Это, в категории на UITextView, должно сделать трюк. Для почему вам нужен fudgefactor см this post

#define kMaxFieldHeight 9999 

-(BOOL)sizeFontToFit:(NSString*)aString minSize:(float)aMinFontSize maxSize:(float)aMaxFontSize 
{ 
float fudgeFactor = 16.0; 
float fontSize = aMaxFontSize; 

self.font = [self.font fontWithSize:fontSize]; 

CGSize tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight); 
CGSize stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap]; 

while (stringSize.height >= self.frame.size.height) 
     { 
     if (fontSize <= aMinFontSize) // it just won't fit 
      return NO; 

     fontSize -= 1.0; 
     self.font = [self.font fontWithSize:fontSize]; 
     tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight); 
     stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap]; 
     } 

return YES; 
} 
+2

в iOS> 7.0 вам нужно изменить UILineBreakModeWordWrap на NSLineBreakByWordWrapping – ignotusverum

+0

просто любопытно, откуда вы знаете «fudgeFactor = 16.0»? Я считаю, что это значение должно быть меньше, если размер текста меньше – Jacky

5

Попробуйте, это намного проще:

while (self.contentSize.height > self.frame.size.height) 
{ 
    self.font = [self.font fontWithSize:self.font.pointSize -1]; 
} 
+0

+1, он отлично работает – NAZIK

+3

Не работает в iOS7. –

+2

@BradMoore, вам нужно добавить еще одну строку: [textView layoutSubviews]; – Jacky

6

Подобный подход к ответу Arie Литовскому, но без суб-причислять (или использование категории) и не используя contentSize, который не вернул правильную высоту отображаемого текста для меня. Проверено на прошивкой 7:

while (((CGSize) [_textView sizeThatFits:_textView.frame.size]).height > _textView.frame.size.height) { 
    _textView.font = [_textView.font fontWithSize:_textView.font.pointSize-1]; 
} 

Подход держать уменьшение размера шрифта, пока текст не только вписывается в рамки окна просмотра текста.

Если вы собираетесь использовать это в производстве вы все равно нужно:

  • Обрабатывать случай, когда даже с наименьшим-возможный размер шрифта текста все равно не будет соответствовать.
  • Использовать аналогичный подход к увеличить размер шрифта, если вы также хотели бы нарисовать текст до, чтобы соответствовать рамке.
+0

Быстрый подход для обработки шрифта «увеличить»: http://pastie.org/8975356 – Anil

2

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

- (void)updateTextFont:(UITextView *)textView 
{ 
    // Only run if has text, otherwise it will make infinity loop 
    if (textView.text.length == 0 || CGSizeEqualToSize(textView.bounds.size, CGSizeZero)) return; 

    /* 
    - Update textView font size 
    If expectHeight > textViewHeight => descrease font size n point until it reach textViewHeight 
    If expectHeight < textViewHeight => inscrease font size n point until it reach textViewHeight 
    */ 
    CGSize textViewSize = textView.frame.size; 
    CGFloat fixedWidth = textViewSize.width; 
    CGSize expectSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)]; 

    UIFont *expectFont = textView.font; 
    if (expectSize.height > textViewSize.height) { 
     while ([textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)].height > textViewSize.height) { 
      expectFont = [textView.font fontWithSize:(textView.font.pointSize-1)]; 
      textView.font = expectFont; 
     } 
    } else { 
     while ([textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)].height < textViewSize.height) { 
      expectFont = textView.font; 
      textView.font = [textView.font fontWithSize:(textView.font.pointSize+1)]; 
     } 
     textView.font = expectFont; 
    } 
} 
+0

Мне любопытно, что здесь делает предложение else. Вы устанавливаете 'expectFont' в' textView '' 'font', прежде чем изменять его ... затем вы установите его обратно на немодифицированный' font'? Разве это не позволяет прыгать вверх и вниз по размеру текста? –

+0

@StephenPaul в else, если while не выполняется, 'textView.font' не изменяется (поскольку' expectFont' на самом деле является оригинальным 'textView.font'). Но если во время работы хотя бы 1 раз, 'expectFont' изменяется, и нам нужно обновить его после завершения цикла. Я мог бы определить флаг во время бега или нет, но я этого не сделал. Вместо этого я группирую его в последнюю строку 'textView.font = expectFont' – nahung89

+0

, если цикл while работает как минимум 1 раз, вы сохраняете текущий шрифт в переменной 'expectFont'. Затем вы увеличиваете шрифт 'textView' на одну точку, но затем, когда этот цикл while выйдет, вы увидите, что шрифт' textView' вернулся к тому, что это было ... –

10

Я преобразовал dementiazz's answer Свифт:

func updateTextFont() { 
    if (textView.text.isEmpty || CGSizeEqualToSize(textView.bounds.size, CGSizeZero)) { 
     return; 
    } 

    let textViewSize = textView.frame.size; 
    let fixedWidth = textViewSize.width; 
    let expectSize = textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat(MAXFLOAT))); 

    var expectFont = textView.font; 
    if (expectSize.height > textViewSize.height) { 
     while (textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat(MAXFLOAT))).height > textViewSize.height) { 
      expectFont = textView.font!.fontWithSize(textView.font!.pointSize - 1) 
      textView.font = expectFont 
     } 
    } 
    else { 
     while (textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat(MAXFLOAT))).height < textViewSize.height) { 
      expectFont = textView.font; 
      textView.font = textView.font!.fontWithSize(textView.font!.pointSize + 1) 
     } 
     textView.font = expectFont; 
    } 
} 
+0

Также вы можете добавить минимальный и максимальный размер шрифта, чтобы избежать непредвиденных размеров. (слишком большой или слишком маленький) Я просто добавил условие «&& (textView.font !.pointSize> CGFloat (minSize))» на ваше время – RubenVot

+0

@RubenVot, когда мы должны использовать эту функцию? – Shyam

0

Обновленной версия коды @Arie Литовском в. Это работает в iOS7 и более поздних версиях и растягивает размер шрифта вверх и вниз, поэтому текст подходит.

- (void) stretchFontToFit:(UITextView*)textView 
{ 

    while(textView.contentSize.height < textView.frame.size.height) 
    { 
     textView.font = [textView.font fontWithSize:textView.font.pointSize +1]; 
     [textView layoutIfNeeded]; 
    } 

    while(textView.contentSize.height > textView.frame.size.height) 
    { 
     textView.font = [textView.font fontWithSize:textView.font.pointSize -1]; 
     [textView layoutIfNeeded]; 
    } 
} 
0

В viewDidLoad:

textView.textContainer.lineFragmentPadding = 0; 
textView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0); 

Вам нужно добавить UITextViewDelegate:

- (void)updateTextFont:(UITextView *)textView { 

    CGSize textViewSize = textView.frame.size; 
    CGSize sizeOfText = [textView.text sizeWithAttributes:@{NSFontAttributeName: textView.font}]; 

    CGFloat fontOfWidth = floorf(textView.font.pointSize/sizeOfText.height * textViewSize.height); 
    CGFloat fontOfHeight = floorf(textView.font.pointSize/sizeOfText.width * textViewSize.width); 

    textView.font = [textView.font fontWithSize:MIN(fontOfHeight, fontOfWidth)]; 
} 
1

Я преобразовал ответ dementiazz в & Matt Frear к Swift 3:

func updateTextFont() { 
     if (textView.text.isEmpty || textView.bounds.size.equalTo(CGSize.zero)) { 
      return 
     } 

    let textViewSize = textView.frame.size 
    let fixedWidth = textViewSize.width 
    let expectSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))) 

    var expectFont = textView.font 
    if (expectSize.height > textViewSize.height) { 
     while (textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))).height > textViewSize.height) { 
      expectFont = textView.font!.withSize(textView.font!.pointSize - 1) 
      textView.font = expectFont 
     } 
    } 
    else { 
     while (textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))).height < textViewSize.height) { 
      expectFont = textView.font 
      textView.font = textView.font!.withSize(textView.font!.pointSize + 1) 
     } 
     textView.font = expectFont 
    } 
} 
+0

Работает для меня. Благодаря! –

-1

U Можно легко сделать это с помощью

  • self.textview.font =

self.textview.font = UIFont (имя: self.textview.font .fontName,
размер: self.textview.frame. size.height/10)!

делит textview.frame.size.height на некоторых постоянной основе вашего требования ..

1

для быстрого 3

func updateTextFont(textView : UITextView) { 


    if (textView.text.isEmpty || textView.bounds.size.equalTo(CGSize.zero)) { 
     return; 
    } 

    let textViewSize = textView.frame.size; 
    let fixedWidth = textViewSize.width; 

    let expectSize = textView.sizeThatFits(CGSize(width : fixedWidth, height : CGFloat(MAXFLOAT))); 

    var expectFont = textView.font; 
    if (expectSize.height > textViewSize.height) { 
     while (textView.sizeThatFits(CGSize(width : fixedWidth, height : CGFloat(MAXFLOAT))).height > textViewSize.height) { 
      expectFont = textView.font!.withSize(textView.font!.pointSize - 1) 
      textView.font = expectFont 
     } 
    } 
    else { 
     while (textView.sizeThatFits(CGSize(width : fixedWidth,height : CGFloat(MAXFLOAT))).height < textViewSize.height) { 
      expectFont = textView.font; 
      textView.font = textView.font!.withSize(textView.font!.pointSize + 1) 
     } 
     textView.font = expectFont; 
    } 
} 
-2

Вот решение для Swift 4 (на основе Arie Litovsky ответ), вы можете поместить этот код в textViewDidChange(_ textView: UITextView) делегат метод:

Уменьшение шрифта:

while (textView.contentSize.height > textView.frame.size.height) { 
     guard let fontName = textView.font?.fontName, let fontSize = textView.font?.pointSize else {return} 
     if fontSize < 12 { 
      return 
     } 
     textView.font = UIFont(name: fontName, size: fontSize - 1) 
     textView.layoutIfNeeded() 
    } 

и расширение шрифта:

 while (textView.contentSize.height < textView.frame.size.height) { 
     guard let fontName = textView.font?.fontName, let fontSize = textView.font?.pointSize else {return} 
     if fontSize > 15 { 
      return 
     } 
     textView.font = UIFont(name: fontName, size: fontSize + 1) 
     textView.layoutIfNeeded() 
    } 

Вы можете изменить fontSize < 12 и fontSize > 15 в соответствии с вашими потребностями в минимальном и максимальном размере шрифта.

 Смежные вопросы

  • Нет связанных вопросов^_^