Ridimensiona la dimensione del carattere per riempire UITextView?

Come impostare la dimensione del carattere del testo in un UITextView in modo da riempire l’intero UITextView? Vorrei che l’utente inserisse il testo, quindi il testo riempisse l’intero UITextView.

Qualsiasi aiuto è apprezzato!

Ho convertito la risposta di dementiazz a 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; } } 

Questo, in una categoria su UITextView, dovrebbe fare il trucco. Per il motivo per cui è necessario il fudgefactor, vedere questo 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; } 

Approccio simile alla risposta di Arie Litovsky ma senza sottoclass (o uso di una categoria) e non usando contentSize che non ha restituito per me l’altezza corretta del testo renderizzato. Testato su iOS 7:

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

L’approccio è di continuare a ridurre la dimensione del font fino a quando il testo non si adatta perfettamente al frame della vista testo.

Se stavi per usarlo in produzione avresti ancora bisogno di:

  • Gestire il caso in cui anche con il più piccolo ansible dimensione del carattere il testo non si adatta ancora.
  • Utilizzare un approccio simile per aumentare la dimensione del font se si desidera ridimensionare il testo per adattarlo alla cornice.

Prova questo, è molto più semplice:

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

Ecco il mio codice di esempio. Fondamentalmente, controllo la dimensione prevista per sapere se la dimensione del carattere deve aumentare o diminuire. È necessario aggiungere UITextViewDelegate alla class per assicurarsi che funzioni

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

Questa proprietà è disponibile solo su UITextFields. Per fare ciò in un UITextView, devi costantemente guardare il testo e regolare manualmente la dimensione del carattere come quella modificata.

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

Ho convertito Dementiazz e la risposta di Matt Frear a 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 } } 

Ho convertito la risposta di Matt Frear a Swift 4.1 come estensione per 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 } } 

}

Una versione aggiornata del codice di @Arie Litovsky. Funziona in iOS7 e versioni successive e allunga le dimensioni del carattere sia verso l’alto che verso il basso in modo che il testo si adatti.

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

In viewDidLoad:

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

È necessario aggiungere 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 può farlo facilmente usando

  • self.textview.font =

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

dividi textview.frame.size.height su alcune costanti in base alle tue esigenze ..

Ecco una soluzione per Swift 4 (basata sulla risposta di Arie Litovsky ), puoi inserire questo codice nel metodo delegato textViewDidChange(_ textView: UITextView) :

Ridimensionamento del carattere:

  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 ingrandendo il carattere:

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

Puoi modificare fontSize < 12 e fontSize > 15 in base alle tue esigenze nella dimensione minima e massima del carattere.