Gibt es eine Möglichkeit, die Schriftgröße in einem UITextView zu verkleinern, wenn zu viel Text vorhanden ist? Ähnlich wie bei einem UILabel?
Antworten
Zu viele Anzeigen?Das Problem bei der akzeptierten Antwort ist, dass Sie die Anzahl der Zeichen (die Länge der Zeichenkette) erraten müssen, die benötigt wird, um das Feld zu füllen, und das ist von Schriftart zu Schriftart unterschiedlich. Etwas wie dies, eine Kategorie auf UITextView, sollte funktionieren.
#import "UITextView+Size.h"
#define kMaxFieldHeight 1000
@implementation UITextView (Size)
-(BOOL)sizeFontToFitMinSize:(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 = [self.text sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
while (stringSize.height >= self.frame.size.height) {
if (fontSize <= aMinFontSize) // it just won't fit, ever
return NO;
fontSize -= 1.0;
self.font = [self.font fontWithSize:fontSize];
tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight);
stringSize = [self.text sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
}
return YES;
}
@end
Swift 4-Implementierung, inspiriert durch die Antwort von @Jane Sales.
Bei der Berechnung der verfügbaren Breite und Höhe müssen auch mögliche vertikale und horizontale Ränder berücksichtigt werden ( textContainerInset
et textContainer.lineFragmentPadding
).
Hier ist eine bessere Erklärung, wie die Margen funktionieren UITextView
: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/TextUILayer/Tasks/SetTextMargins.html
Wenn die Textansicht ihre Größe ändern kann, müssen wir auch ein Layout erzwingen, damit wir die Schriftgröße auf der Grundlage der größtmöglichen Größe der Textansicht berechnen können. In diesem Fall wird nur die Höhe berücksichtigt (Layouts nur, wenn die erforderliche Texthöhe größer ist als die ursprünglich verfügbare Höhe).
import UIKit
extension UITextView {
func adjustFontToFitText(minimumScale: CGFloat) {
guard let font = font else {
return
}
let scale = max(0.0, min(1.0, minimumScale))
let minimumFontSize = font.pointSize * scale
adjustFontToFitText(minimumFontSize: minimumFontSize)
}
func adjustFontToFitText(minimumFontSize: CGFloat) {
guard let font = font, minimumFontSize > 0.0 else {
return
}
let minimumSize = floor(minimumFontSize)
var fontSize = font.pointSize
let availableWidth = bounds.width - (textContainerInset.left + textContainerInset.right) - (2 * textContainer.lineFragmentPadding)
var availableHeight = bounds.height - (textContainerInset.top + textContainerInset.bottom)
let boundingSize = CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)
var height = text.boundingRect(with: boundingSize, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil).height
if height > availableHeight {
// If text view can vertically resize than we want to get the maximum possible height
sizeToFit()
layoutIfNeeded()
availableHeight = bounds.height - (textContainerInset.top + textContainerInset.bottom)
}
while height >= availableHeight {
guard fontSize > minimumSize else {
break
}
fontSize -= 1.0
let newFont = font.withSize(fontSize)
height = text.boundingRect(with: boundingSize, options: .usesLineFragmentOrigin, attributes: [.font: newFont], context: nil).height
}
self.font = font.withSize(fontSize)
}
}