Redimensionar o tamanho da fonte para preencher o UITextView?

Como eu configuraria o tamanho da fonte do texto em um UITextView de modo a preencher todo o UITextView? Eu gostaria que o usuário digitasse seu texto, então o texto preenchesse todo o UITextView.

Qualquer ajuda é apreciada!

Eu converti a resposta da dementiazz para Swift:

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; } } 

Isso, em uma categoria no UITextView, deve fazer o truque. Por que você precisa do fudgefactor, veja este 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; } 

Abordagem semelhante à resposta de Arie Litovsky, mas sem subsorting (ou uso de uma categoria) e não usando contentSize que não retornou a altura correta do texto renderizado para mim. Testado no iOS 7:

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

A abordagem é continuar reduzindo o tamanho da fonte até que o texto simplesmente caiba dentro do quadro da exibição de texto.

Se você fosse usar isso na produção, ainda precisaria:

  • Lide com o caso em que, mesmo com o menor tamanho de fonte possível, o texto ainda não se encheckbox.
  • Use uma abordagem semelhante para aumentar o tamanho da fonte, se você também quiser dimensionar o texto para ajustá-lo ao quadro.

Tente isso, é muito mais simples:

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

Aqui está o meu código de amostra. Basicamente, eu verifico o tamanho esperado para saber se o tamanho da fonte precisa aumentar ou diminuir. Você precisa adicionar o UITextViewDelegate à sua turma para garantir que ele funcione

 - (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; } } 

Esta propriedade está disponível apenas em UITextFields. Para fazer isso em um UITextView, você teria que observar constantemente o texto e ajustar manualmente o tamanho da fonte conforme a alteração.

para 3 rápido

  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; } } 

Eu converti a resposta de dementiazz e Matt Frear para o 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 } } 

Eu converti a resposta de Matt Frear para o Swift 4.1 como extensão para o UITextView:

 extension UITextView { func updateTextFont() { if (self.text.isEmpty || self.bounds.size.equalTo(CGSize.zero)) { return; } let textViewSize = self.frame.size; let fixedWidth = textViewSize.width; let expectSize = self.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))) var expectFont = self.font if (expectSize.height > textViewSize.height) { while (self.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))).height > textViewSize.height) { expectFont = self.font!.withSize(self.font!.pointSize - 1) self.font = expectFont } } else { while (self.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))).height < textViewSize.height) { expectFont = self.font self.font = self.font!.withSize(self.font!.pointSize + 1) } self.font = expectFont } } 

}

Uma versão atualizada do código do @Arie Litovsky. Isso funciona no iOS7 e versões posteriores e aumenta o tamanho da fonte para cima e para baixo, para que o texto caiba.

 - (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]; } } 

Em viewDidLoad:

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

Você precisa adicionar o 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)]; } 

U pode facilmente fazer isso usando

  • self.textview.font =

self.textview.font = UIFont (nome: self.textview.font! .fontName,
tamanho: self.textview.frame.size.height / 10)!

divida textview.frame.size.height em cima de alguma constante baseada em sua exigência

Aqui está uma solução para o Swift 4 (com base na resposta de Arie Litovsky ), você pode colocar esse código no método delegado textViewDidChange(_ textView: UITextView) :

Diminuindo a escala da fonte:

  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() } 

E ampliando a fonte:

  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() } 

Você pode alterar o fontSize < 12 e fontSize > 15 para atender às suas necessidades no tamanho mínimo e máximo da fonte.