Получите динамическую высоту UITextView с автоматической компоновкой после установки текста
У меня UITextView не прокручивается с автоматической компоновкой, заданной конструктором интерфейса, а текст увеличивается или уменьшается динамически без проблем, но я хочу знать, что такое новая высота UITextView после установки текста, я пытаюсь это сделать:
NSLog(@"text before: %.2f",self.myText.frame.size.height);
[self.myText setText:self.string];
NSLog(@"text after: %.2f",self.myText.frame.size.height);
это результат:
text before: 47.50
text after: 47.50
текст увеличивается в представлении, когда я запускаю его, но размер тот же, как я могу получить реальную высоту после установки текста?
Ответы
Ответ 1
Это должно работать:
NSLog(@"text before: %.2f",self.myText.frame.size.height);
[self.myText setText:self.string];
[self.myText layoutIfNeeded]; // <--- Add this
NSLog(@"text after: %.2f",self.myText.frame.size.height);
Вот пример реализации на моем Github: https://github.com/guillaume-algis/SO-27060338
Ответ 2
Все, что вам нужно сделать, это настроить все ваши ограничения, кроме высоты один, и установить для textView
scrollEnabled
значение NO
. Последняя часть - вот что делает трюк. Ваше текстовое представление будет автоматически изменяться в зависимости от его текстового значения.
Ответ 3
Если вы предпочитаете делать все это автоматически:
In Size Inspector:
-
Установите приоритет сопротивления сжатию содержимого по вертикали до 1000.
-
Опустите приоритет высоты ограничения для вашего UITextView. Просто сделайте это меньше 1000.
Инспектор атрибутов:
- Снимите флажок Включить прокрутку.
Ответ 4
Я использовал код, указанный по следующей ссылке AutoLayout с динамической высотой UITextView, и это сработало для меня :)
Ответ 5
Используйте нижеприведенный код:
Код цели-C
[textView setScrollEnabled:NO];
Быстрый код
textView.isScrollEnabled = false
Ответ 6
Swift 3.0
textView.isScrollEnabled = false
Это позволяет AutoLayout выполнять свою работу.
Ответ 7
Сразу после изменения текстового вызова
[self.myText sizeToFit];
Ответ 8
В отличие от UILabel, UITextView не имеет собственного свойства. Итак, как я это сделал, было настроено ограничение высоты UITextView
, подключено через IBOutlet и изменилось его значение в textViewDidChange
или при изменении текста.
@IBOutlet weak var textViewHeight: NSLayoutConstraint!
func textViewDidChange(textView: UITextView) {
// dynamic height adjustments
var height = ceil(textView.contentSize.height) // ceil to avoid decimal
if height != textViewHeight.constant { // set when height changed
textViewHeight.constant = height
textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes
}
}
Ответ 9
- (void)textViewDidChange:(UITextView *)textView
{
UIFont *myFont = [UIFont systemFontOfSize:14];
CGSize size = [self sizeOfText:textView.text widthOfTextView:TextviewWidth withFont:myFont];
NSLog(@"Height : %f", size.height);
}
-(CGSize)sizeOfText:(NSString *)textToMesure widthOfTextView:(CGFloat)width withFont:(UIFont*)font
{
CGSize ts = [textToMesure sizeWithFont:font constrainedToSize:CGSizeMake(width-20.0, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
return ts;
}
Ответ 10
выберите текст и снимите флажок "Прокрутка включена"
выберите textview из верхнего меню "Редактор", размер которого соответствует содержимому "
выберите вид под ним, установите его верхние ограничения в нижней части текста для любого поля, а затем перейдите в "Инспектор размеров", дважды щелкните или отредактируйте только что добавленное ограничение и установите для параметра "Отношение" значение "Больше или равно" "
Ответ 11
Еще один подход заключается в использовании
myTextView.textContainer.heightTracksTextView = true
Это позволяет включить прокрутку
Ответ 12
Ну, я не конвертировал этот код в синтаксис swift4, но логика останется прежней. Это метод расширения для Xamarin.ios (С#).
public static nfloat GetEstimateHeight(this UITextView textView, UIView View)
{
var size = new CoreGraphics.CGSize(View.Frame.Width, height: float.PositiveInfinity);
var estimatedSize = textView.SizeThatFits(size);
return estimatedSize.Height;
}
Логика, которая будет работать для Swift
var size = new CoreGraphics.CGSize(View.Frame.Width, height: float.PositiveInfinity);
var estimatedSize = textView.SizeThatFits(size);
var textViewFinalHeight = estimatedSize.Height;
Ответ 13
Просто дополнение согласно ответу @Pavel Gurov. Если вы уже установили ограничение по высоте, просто сделайте его неактивным. Также стоит позвонить .sizeToFit()
после этого, чтобы убедиться, что действие по изменению размера выполнено.
theTextViewHeightConstraint.isActive = false
theTextView.isScrollEnabled = false
theTextView.text = "some text"
theTextView.sizeToFit()