2016-08-02 10 views
9

Wie Sie in diesem Bild sehen könnenwie UITextView Höhe dynamisch nach Textlänge machen?

die UITextView ändert seine Höhe nach der Länge des Textes, ich möchte es anpassen seine Höhe nach der Textlänge.

* Ich sah noch andere Fragen, aber Lösungen gibt für mich nicht

example

+0

Mögliche Duplikat [Wie kann ich einen UITextView dessen Inhalt Größe?] (Http://Paketüberfluss.Ich benutze nextGrowingTextView https://github.com/muukii/NextGrowingTextView Ich habe sogar eine Implementierung in Objective https geschrieben. com/questions/50467/how-do-i-size-a-uitextview-to-its-content) –

+0

: //github.com/mcmatan/NextGrowingInternalTextViewObjectiveC – MCMatan

+0

CSGrowingTextView ist auch eine Alternative für dieses Problem: https://github.com/cloverstudio/CSGrowingTextView –

Antwort

30

diese Works für mich, alle anderen Lösungen nicht.

func adjustUITextViewHeight(arg : UITextView) 
{ 
    arg.translatesAutoresizingMaskIntoConstraints = true 
    arg.sizeToFit() 
    arg.scrollEnabled = false 
} 

In Swift 4 Die Syntax arg.scrollEnabled = false hat arg.isScrollEnabled = false verändert.

+0

Wenn ein riesiger Text vorhanden ist, wird Text nicht angezeigt, wenn ich die Eigenschaft scrollEnabled falsch mache. Kannst du mir bitte dabei helfen? ? Ich meine, Text ist da, aber er ist nicht sichtbar. –

+0

Bitte stellen Sie eine separate Frage mit vollständigen Code und Storyboard-Details. – DeyaEldeen

+0

@DeyaEldeen +1, es funktioniert und ich habe auch mit statischen Tableview-Zelle versucht, ausgezeichnet :) – elia

8

Geben Sie diesen einen Versuch funktionieren:

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

Bearbeiten- Hier ist die Swift:

var frame = self.textView.frame 
frame.size.height = self.textView.contentSize.height 
self.textView.frame = frame 
+0

das ist obj-c, ich benutze swift. – DeyaEldeen

+0

Sehr sehr ähnlich. siehe bearbeiten @DeyaEldeen –

+0

ok, danke, ich werde auch dieses versuchen und dir das Ergebnis sagen. – DeyaEldeen

1

es ist gerade forw auf programmatische Weise zu tun. folgen Sie einfach diesen Schritten

  1. einen Beobachter zum Inhalt Länge von Textfeld nach einiger Zeit zu erhöhen, während der Eingabe

    [yourTextViewObject addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL]; 
    
  2. implementieren Beobachter

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    UITextView *tv = object; 
    
        //Center vertical alignment 
        CGFloat topCorrect = ([tv bounds].size.height - [tv contentSize].height * [tv zoomScale])/2.0; 
        topCorrect = (topCorrect < 0.0 ? 0.0 : topCorrect); 
        tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect}; 
    
    
        mTextViewHeightConstraint.constant = tv.contentSize.height; 
    
        [UIView animateWithDuration:0.2 animations:^{ 
    
         [self.view layoutIfNeeded]; 
        }]; 
    
    } 
    
  3. wenn Sie wollen aufhören textviewHeight hinzufügen Implementiere dies und setze den textview delegate auf self.

    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
    { 
        if(range.length + range.location > textView.text.length) 
        { 
         return NO; 
        } 
    
        NSUInteger newLength = [textView.text length] + [text length] - range.length; 
    
        return (newLength > 100) ? NO : YES; 
    
    } 
    
+0

das ist obj-c, ich benutze swift. – DeyaEldeen

+0

@DeyaEldeen oops, plz schreiben entsprechenden code .. :) –

+0

ich fügte das swift-Tag in der Frage, so dreht sich alles um schnelle. – DeyaEldeen

4

Gefolgt von DeyaEldeens Antwort.
In meinem Fall. Ich wachse die Textview Höhe automatisch durch Hinzufügen

swift 3

textView.translatesAutoresizingMaskIntoConstraints = false textView.isScrollEnabled = false

0

Hier sind zwei Fallen in iOS 8.3, wenn sie mit textView.textContainer.maximumNumberOfLines = 10

Siehe meine gist kommen, bitte.

textView.attributedText = originalContent 

let lineLimit = 10 
textView.isEditable = true 
textView.isScrollEnabled = false 
textView.textContainerInset = .zero // default is (8, 0, 8, 0) 
textView.textContainer.maximumNumberOfLines = lineLimit // Important condition 
textView.textContainer.lineBreakMode = .byTruncatingTail 

// two incomplete methods, which do NOT work in iOS 8.3 

// size.width可能比maxSize.width小 ————遗憾的是 iOS 8.3 上此方法无视maximumNumberOfLines参数,所以得借助于UILabel 
// size.width may be less than maxSize.width, ---- Do NOT work in iOS 8.3, which disregards textView.textContainer.maximumNumberOfLines 
// let size = textView.sizeThatFits(maxSize) 

// 遗憾的是 iOS 8.3 上此方法失效了,得借助于UILabel 
// Does not work in iOS 8.3 
// let size = textView.layoutManager.usedRectForTextContainer(textView.textContainer).size 

// Suggested method: use a temperary label to get its size 
let label = UILabel(); label.attributedText = originalContent 
let size = label.textRect(forBounds: CGRect(origin: .zero, size: maxSize), limitedToNumberOfLines: lineLimit).size 
textView.frame.size = size 
0

Swift 4

Fügen Sie es Ihrer Klasse

UITextViewDelegate

func textViewDidChange(_ textView: UITextView) { 
     let fixedWidth = textView.frame.size.width 
     textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude)) 
     let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude)) 
     var newFrame = textView.frame 
     newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height) 
     textView.frame = newFrame 
} 
Verwandte Themen