5 Stimmen

Ändern der Schriftgröße in UITextView

Gibt es eine Möglichkeit, die Schriftgröße in einem UITextView zu verkleinern, wenn zu viel Text vorhanden ist? Ähnlich wie bei einem UILabel?

12voto

Jane Sales Punkte 13516

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

8voto

Jacob Relkin Punkte 156445

Versuchen Sie dies:

NSInteger lengthThreshold = 200;
if( [ textView.text length ] > lengthThreshold ) {
    NSInteger newSize = ... //calculate new size based on length

    [ textView setFont: [ UIFont systemFontOfSize: newSize ]];
}

3voto

Crt Gregoric Punkte 292

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

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X