Как мне определить размер UITextView для его содержимого?

Как и VS 2017, это выглядит как встроенная функция. Нажмите Ctrl +. в то время как ваш курсор находится в классе, и выберите «Generate Constructor» из раскрывающегося списка «Быстрые действия и рефакторинг».

506
задан Alok 29 May 2018 в 11:59
поделиться

7 ответов

Вы пробовали [textView sizeThatFits:textView.bounds]?

Редактирование: sizeThatFits возвращает размер, но на самом деле не изменяет размеры компонента. Я не уверен, является ли это тем, что Вы хотите, или если [textView sizeToFit] больше, что Вы искали. В любом случае я не знаю, будет ли он совершенно пригодный, содержание как Вы хочет, но это - первая вещь попробовать.

12
ответ дан Mike McMaster 29 May 2018 в 11:59
поделиться

Другой метод является находкой размер, конкретная строка займется использованием NSString метод:

-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

Это возвращает размер прямоугольника, который оснащает данную строку данным шрифтом. Передача в размере с желаемой шириной и максимальной высотой, и затем можно посмотреть на высоту, возвращенную для установки тексту. Существует версия, которая позволяет Вам определить режим разрыва строки также.

можно тогда использовать возвращенный размер для изменения размера представления для установки.

9
ответ дан Venk 29 May 2018 в 11:59
поделиться

Объединенный с ответом Mike McMaster, Вы могли бы хотеть сделать что-то как:

[myTextView setDelegate: self];

...

- (void)textViewDidChange:(UITextView *)textView {
  if (myTextView == textView) {
     // it changed.  Do resizing here.
  }
}
6
ответ дан Olie 29 May 2018 в 11:59
поделиться

В моем (ограниченном) опыте,

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

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

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

, действительно кажется, уважает новые строки.

кроме того, текст на самом деле не представляется наверху UITextView. В моем коде я установил новую высоту UITextView, чтобы быть на 24 пикселя больше, чем высота, возвращенная эти sizeOfFont методы.

24
ответ дан Venk 29 May 2018 в 21:59
поделиться

Надеюсь, это поможет:

- (void)textViewDidChange:(UITextView *)textView {
  CGSize textSize = textview.contentSize;
  if (textSize != textView.frame.size)
      textView.frame.size = textSize;
}
1
ответ дан 22 November 2019 в 22:33
поделиться

Это больше не работает на iOS 7 и выше

На самом деле есть очень простой способ изменить размер UITextView до правильной высоты содержимого. Это можно сделать, используя UITextView contentSize.

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

Следует отметить, что правильный contentSize доступен только после добавления UITextView в представление с помощью addSubview. До этого он был равен frame.size

Это не будет работать, если включена автоматическая компоновка. При автоматической компоновке общий подход заключается в использовании метода sizeThatFits и обновлении значения constant на ограничении высоты.

CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.frame.size];
heightConstraint.constant = sizeThatShouldFitTheContent.height;

heightConstraint - это ограничение компоновки, которое вы обычно устанавливаете через IBOutlet, связывая свойство с ограничением высоты, созданным в раскадровке.


Просто чтобы добавить к этому удивительному ответу, 2014, если вы:

[self.textView sizeToFit];

есть разница в поведении только с iPhone6+:

enter image description here

Только с 6+ (не 5s или 6) он добавляет "еще одну пустую строку" в UITextView. Решение RL" прекрасно исправляет это:

CGRect _f = self.mainPostText.frame;
_f.size.height = self.mainPostText.contentSize.height;
self.mainPostText.frame = _f;

Оно исправляет проблему "лишней строки" на 6+.

576
ответ дан 22 November 2019 в 22:33
поделиться

Это довольно легко с Наблюдением значения ключа (KVO), просто создайте подкласс UITextView и сделайте:

private func setup() { // Called from init or somewhere

    fitToContentObservations = [
        textView.observe(\.contentSize) { _, _ in
            self.invalidateIntrinsicContentSize()
        },
        // For some reason the content offset sometimes is non zero even though the frame is the same size as the content size.
        textView.observe(\.contentOffset) { _, _ in
            if self.contentOffset != .zero { // Need to check this to stop infinite loop
                self.contentOffset = .zero
            }
        }
    ]
}
public override var intrinsicContentSize: CGSize {
    return contentSize
}

, Если Вы не хотите разделять Вас на подклассы, мог бы попытаться делать textView.bounds = textView.contentSize в contentSize наблюдатель.

0
ответ дан 22 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: