Как и VS 2017, это выглядит как встроенная функция. Нажмите Ctrl +. в то время как ваш курсор находится в классе, и выберите «Generate Constructor» из раскрывающегося списка «Быстрые действия и рефакторинг».
Вы пробовали [textView sizeThatFits:textView.bounds]
?
Редактирование: sizeThatFits возвращает размер, но на самом деле не изменяет размеры компонента. Я не уверен, является ли это тем, что Вы хотите, или если [textView sizeToFit]
больше, что Вы искали. В любом случае я не знаю, будет ли он совершенно пригодный, содержание как Вы хочет, но это - первая вещь попробовать.
Другой метод является находкой размер, конкретная строка займется использованием NSString
метод:
-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
Это возвращает размер прямоугольника, который оснащает данную строку данным шрифтом. Передача в размере с желаемой шириной и максимальной высотой, и затем можно посмотреть на высоту, возвращенную для установки тексту. Существует версия, которая позволяет Вам определить режим разрыва строки также.
можно тогда использовать возвращенный размер для изменения размера представления для установки.
Объединенный с ответом Mike McMaster, Вы могли бы хотеть сделать что-то как:
[myTextView setDelegate: self];
...
- (void)textViewDidChange:(UITextView *)textView {
if (myTextView == textView) {
// it changed. Do resizing here.
}
}
В моем (ограниченном) опыте,
- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode
не уважает символы новой строки, таким образом, можно закончить с намного более коротким CGSize
, чем на самом деле требуется.
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
, действительно кажется, уважает новые строки.
кроме того, текст на самом деле не представляется наверху UITextView
. В моем коде я установил новую высоту UITextView
, чтобы быть на 24 пикселя больше, чем высота, возвращенная эти sizeOfFont
методы.
Надеюсь, это поможет:
- (void)textViewDidChange:(UITextView *)textView {
CGSize textSize = textview.contentSize;
if (textSize != textView.frame.size)
textView.frame.size = textSize;
}
На самом деле есть очень простой способ изменить размер 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+:
Только с 6+ (не 5s или 6) он добавляет "еще одну пустую строку" в UITextView. Решение RL" прекрасно исправляет это:
CGRect _f = self.mainPostText.frame;
_f.size.height = self.mainPostText.contentSize.height;
self.mainPostText.frame = _f;
Оно исправляет проблему "лишней строки" на 6+.
Это довольно легко с Наблюдением значения ключа (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
наблюдатель.