2016-08-02 1 views
9

Как вы можете видеть на этом изображенииКак сделать UITextView динамической по длине текста?

UITextView изменяет его высоту в соответствии с длиной текста, я хочу настроить его высоту в соответствии с длиной текста.

* Я видел другие вопросы, но решения там не работает для меня

example

+0

Возможный дубликат [Как размер в UITextView на его содержание?] (HTTP://переполнение стека.com/questions/50467/how-do-i-size-a-uitextview-to-its-content) –

+0

Я использую nextGrowingTextView https://github.com/muukii/NextGrowingTextView Я даже написал реализацию в Objective c https : //github.com/mcmatan/NextGrowingInternalTextViewObjectiveC – MCMatan

+0

CSGrowingTextView также является альтернативой этой проблеме: https://github.com/cloverstudio/CSGrowingTextView –

ответ

30

это Работы для меня, все другие решения не было.

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

В Swift 4 синтаксис arg.scrollEnabled = false изменился на arg.isScrollEnabled = false.

+0

Когда есть огромный текст, текст не отображается, когда я делаю false для свойства 'scrollEnabled'. Можете ли вы помочь мне в этом. ? Я имею в виду текст, но это не видно. –

+0

, пожалуйста, задайте отдельный вопрос с подробными подробностями кода и раскадровки. – DeyaEldeen

+0

@DeyaEldeen +1, он работает, а также я пробовал со статичной ячейкой tableview, отлично :) – elia

8

Дайте этому попытку:

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

Edit- Вот Swift:

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

это obj-c, я использую swift. – DeyaEldeen

+0

Очень очень похоже. см. править @DeyaEldeen –

+0

ОК, спасибо, я тоже попробую это, и скажу вам результат. – DeyaEldeen

1

это прямой forw чтобы сделать это программным образом. выполните следующие действия

  1. добавить наблюдателя на длину содержимого текстового поля

    [yourTextViewObject addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL]; 
    
  2. осуществлять наблюдатель

    -(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. , если вы хотите, чтобы остановить textviewHeight увеличить через некоторое время во время ввода текста затем выполните это и установите делегат textview для себя.

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

это obj-c, я использую swift. – DeyaEldeen

+0

@DeyaEldeen oops, plz написать соответствующий код .. :) –

+0

Я добавил быстрый тег в вопрос, так что это все о быстром. – DeyaEldeen

4

В ответ отвечает Дея Элдин.
В моем случае. Я автоматически расти высоту TextView, добавив

скор 3

textView.translatesAutoresizingMaskIntoConstraints = false textView.isScrollEnabled = false

0

Вот два нюанса в прошивкой 8.3 приходя с textView.textContainer.maximumNumberOfLines = 10

Обратитесь к моему gist, пожалуйста.

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

добавить его в свой класс

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 
}