565 Stimmen

Wie kann ich die Größe einer UITextView an den Inhalt anpassen?

Gibt es eine gute Möglichkeit, die Größe einer UITextView mit ihrem Inhalt übereinstimmen? Sagen wir, ich habe zum Beispiel eine UITextView die eine Textzeile enthält:

"Hello world"

Dann füge ich eine weitere Textzeile hinzu:

"Goodbye world"

Gibt es eine gute Möglichkeit in Cocoa Touch, die rect die alle Zeilen in der Textansicht enthält, so dass ich die übergeordnete Ansicht entsprechend anpassen kann?

Ein weiteres Beispiel ist das Feld "Notizen" für Ereignisse in der Kalenderanwendung - beachten Sie, wie die Zelle (und die UITextView enthält) wird erweitert, um alle Textzeilen der Notenzeichenfolge aufzunehmen.

0 Stimmen

Bitte aktualisieren Sie die korrekte Antwort, da die akzeptierte Antwort zu unnötigen Berechnungen führt; jetzt gibt es eine contentSize-Eigenschaft für dieses Problem.

0 Stimmen

Warum gibt es keine Fragen dazu, wie man das nicht dynamisch machen kann? Ich kann nicht einmal herausfinden, wie man es statisch macht. Und die bereitgestellten Lösungen scheinen nicht zu "Einschränkungen" in Storyboard außer Kraft setzen.

1voto

Gal Blank Punkte 2041

Für diejenigen, die wollen, dass die Textansicht tatsächlich nach oben wandert und die Position in der unteren Zeile beibehält

CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;

if(frame.size.height > textView.frame.size.height){
    CGFloat diff = frame.size.height - textView.frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y - diff, textView.frame.size.width, frame.size.height);
}
else if(frame.size.height < textView.frame.size.height){
    CGFloat diff = textView.frame.size.height - frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y + diff, textView.frame.size.width, frame.size.height);
}

1voto

Apfelsaft Punkte 5626

Basierend auf der Antwort von Nikita Took kam ich zu folgender Lösung in Swift, die unter iOS 8 mit Autolayout funktioniert:

    descriptionTxt.scrollEnabled = false
    descriptionTxt.text = yourText

    var contentSize = descriptionTxt.sizeThatFits(CGSizeMake(descriptionTxt.frame.size.width, CGFloat.max))
    for c in descriptionTxt.constraints() {
        if c.isKindOfClass(NSLayoutConstraint) {
            var constraint = c as! NSLayoutConstraint
            if constraint.firstAttribute == NSLayoutAttribute.Height {
                constraint.constant = contentSize.height
                break
            }
        }
    }

0voto

jithin Punkte 449

Wenn Sie scrollview und content view verwenden und die Höhe in Abhängigkeit von der Höhe des TextView-Inhalts erhöhen möchten, dann wird Ihnen dieses Stück Code helfen.

Hoffe, das wird helfen, es funktionierte perfekt in iOS9.2

und natürlich setzen textview.scrollEnabled = NO;

-(void)adjustHeightOfTextView
{
    //this pieces of code will helps to adjust the height of the uitextview View W.R.T content
    //This block of code work will calculate the height of the textview text content height and calculate the height for the whole content of the view to be displayed.Height --> 400 is fixed,it will change if you change anything in the storybord.

CGSize textViewSize = [self.textview sizeThatFits:CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)];//calulcate the content width and height

float textviewContentheight =textViewSize.height;
self.scrollview.contentSize = CGSizeMake(self.textview.frame.size.width,textviewContentheight + 400);//height value is passed
self.scrollview.frame =CGRectMake(self.scrollview.frame.origin.x, self.scrollview.frame.origin.y, self.scrollview.frame.size.width, textviewContentheight+400);

CGRect Frame = self.contentview.frame;
Frame.size.height = textviewContentheight + 400;
[self.contentview setFrame:Frame];

self.textview.frame =CGRectMake(self.textview.frame.origin.x, self.textview.frame.origin.y, self.textview.frame.size.width, textviewContentheight);
[ self.textview setContentSize:CGSizeMake( self.textview.frame.size.width,textviewContentheight)];
self.contenview_heightConstraint.constant = 

self.scrollview.bounds.size.height;
    NSLog(@"%f",self.contenview_heightConstraint.constant);
}

0voto

madmik3 Punkte 6909

Diese Methode scheint für ios7 zu funktionieren

 // Code from apple developer forum - @Steve Krulewitz, @Mark Marszal, @Eric Silverberg
- (CGFloat)measureHeight
{
    if ([self respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)])
    {
    CGRect frame = internalTextView.bounds;
    CGSize fudgeFactor;
    // The padding added around the text on iOS6 and iOS7 is different.
    fudgeFactor = CGSizeMake(10.0, 16.0);

    frame.size.height -= fudgeFactor.height;
    frame.size.width -= fudgeFactor.width;

    NSMutableAttributedString* textToMeasure;
    if(internalTextView.attributedText && internalTextView.attributedText.length > 0){
        textToMeasure = [[NSMutableAttributedString alloc] initWithAttributedString:internalTextView.attributedText];
    }
    else{
        textToMeasure = [[NSMutableAttributedString alloc] initWithString:internalTextView.text];
        [textToMeasure addAttribute:NSFontAttributeName value:internalTextView.font range:NSMakeRange(0, textToMeasure.length)];
    }

    if ([textToMeasure.string hasSuffix:@"\n"])
    {
        [textToMeasure appendAttributedString:[[NSAttributedString alloc] initWithString:@"-" attributes:@{NSFontAttributeName: internalTextView.font}]];
    }

    // NSAttributedString class method: boundingRectWithSize:options:context is
    // available only on ios7.0 sdk.
    CGRect size = [textToMeasure boundingRectWithSize:CGSizeMake(CGRectGetWidth(frame), MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                              context:nil];

    return CGRectGetHeight(size) + fudgeFactor.height;
}
else
{
    return self.internalTextView.contentSize.height;
}
}

0voto

Andrea Punkte 25384

Der einfachste Weg, eine UITextView ruft einfach -sizeToFit sollte es auch funktionieren mit scrollingEnabled = YES Danach überprüfen Sie die Höhe und fügen der Textansicht eine Höhenbeschränkung mit demselben Wert hinzu.
Achten Sie darauf, dass UITexView enthält Einschübe, d.h. Sie können das String-Objekt nicht fragen, wie viel Platz es verwenden möchte, da dies nur das Begrenzungsrechteck des Textes ist.
Alle Personen, die eine falsche Größe haben, verwenden -sizeToFit Das liegt wahrscheinlich daran, dass die Textansicht noch nicht an die Schnittstellengröße angepasst wurde.
Dies geschieht immer dann, wenn Sie Größenklassen und eine UITableView das erste Mal, dass Zellen in der Datenbank erstellt werden - tableView:cellForRowAtIndexPath: die mit der Größe der any-any-Konfiguration herauskommt, wenn Sie Ihren Wert gerade jetzt berechnen, wird die Textansicht eine andere Breite als die erwartete haben und das wird alle Größen durcheinanderbringen.
Um dieses Problem zu lösen, habe ich es als nützlich empfunden, die -layoutSubviews Methode der Zelle, um die Höhe der Textansicht neu zu berechnen.

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