Как мне определить размер UITextView для его содержимого? - PullRequest
503 голосов
/ 08 сентября 2008

Есть ли хороший способ настроить размер UITextView в соответствии с его содержимым? Скажем, например, у меня есть UITextView, который содержит одну строку текста:

"Hello world"

Затем я добавляю еще одну строку текста:

"Goodbye world"

Есть ли хороший способ в Cocoa Touch получить rect, который будет содержать все строки в текстовом представлении, чтобы я мог соответствующим образом настроить родительский вид?

В качестве другого примера посмотрите на поле заметок для событий в приложении «Календарь» - обратите внимание, как ячейка (и UITextView, который она содержит) расширяется, чтобы содержать все строки текста в строке заметок.

Ответы [ 36 ]

8 голосов
/ 24 октября 2012

Если у вас нет удобной UITextView (например, вы измеряете ячейки табличного представления), вам придется рассчитать размер, измерив строку, а затем учитывать 8 пунктов заполнения для каждого сторона UITextView. Например, если вы знаете желаемую ширину вашего текстового представления и хотите определить соответствующую высоту:

NSString * string = ...;
CGFloat textViewWidth = ...;
UIFont * font = ...;

CGSize size = CGSizeMake(textViewWidth - 8 - 8, 100000);
size.height = [string sizeWithFont:font constrainedToSize:size].height + 8 + 8;

Здесь каждый 8 соответствует одному из четырех дополнительных ребер, а 100000 служит очень большим максимальным размером.

На практике вы можете добавить дополнительные font.leading к высоте; это добавляет пустую строку ниже вашего текста, которая может выглядеть лучше, если прямо под текстовым представлением есть визуально тяжелые элементы управления.

7 голосов
/ 02 ноября 2015

Достаточно следующих вещей:

  1. Просто не забудьте установить прокрутка включена на NO для UITextView:

enter image description here

  1. Правильно установлены ограничения автоматической разметки.

Вы даже можете использовать UITableViewAutomaticDimension.

7 голосов
/ 04 марта 2016

Мы можем сделать это по ограничениям.

  1. Установить ограничения высоты для UITextView. enter image description here

2.Создать IBOutlet для этого ограничения по высоте.

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *txtheightconstraints;

3. Не забудьте установить делегат для вашего текстового просмотра.

4

-(void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    NSLog(@"this is updating height%@",NSStringFromCGSize(newFrame.size));
    [UIView animateWithDuration:0.2 animations:^{
                  _txtheightconstraints.constant=newFrame.size.height;
    }];

}

затем обновите ограничение следующим образом:)

6 голосов
/ 06 ноября 2008

В сочетании с ответом Майка МакМастера вы можете сделать что-то вроде:

[myTextView setDelegate: self];

...

- (void)textViewDidChange:(UITextView *)textView {
  if (myTextView == textView) {
     // it changed.  Do resizing here.
  }
}
6 голосов
/ 04 июня 2015

Начиная с iOS 8, можно использовать функции автоматического размещения UITableView для автоматического изменения размера UITextView без какого-либо пользовательского кода вообще. Я поместил проект в github , который демонстрирует это в действии, но вот ключ:

  1. В UITextView должна быть отключена прокрутка, которую вы можете сделать программно или через конструктор интерфейса. Размер не изменится, если включена прокрутка, поскольку прокрутка позволяет просматривать содержимое большего размера.
  2. В viewDidLoad для UITableViewController, вы должны установить значение для оцененного значения RowHeight и затем установить rowHeight в UITableViewAutomaticDimension.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView.estimatedRowHeight = self.tableView.rowHeight;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}
  1. Цель развертывания проекта должна быть iOS 8 или выше.
6 голосов
/ 02 января 2015

Ребята, использующие autolayout, и ваш sizetofit не работает, тогда, пожалуйста, проверьте ограничение ширины один раз. Если вы пропустили ограничение ширины, высота будет точной.

Нет необходимости использовать любой другой API. только одна строка решит все проблемы.

[_textView sizeToFit];

Здесь я занимался только высотой, сохраняя фиксированную ширину и пропустив ограничение ширины моего TextView в раскадровке.

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

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

6 голосов
/ 14 марта 2011

Я нашел способ изменить высоту текстового поля в соответствии с текстом внутри него, а также расположить метку под ним в соответствии с высотой текстового поля! Вот код

UITextView *_textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 10, 300, 10)];
NSString *str = @"This is a test text view to check the auto increment of height of a text view. This is only a test. The real data is something different.";
_textView.text = str;

[self.view addSubview:_textView];
CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 5 + frame.origin.y + frame.size.height, 300, 20)];
lbl.text = @"Hello!";
[self.view addSubview:lbl];
4 голосов
/ 21 марта 2017

Я просмотрел все ответы и все держал фиксированную ширину и корректировал только высоту. Если вы хотите отрегулировать также ширину, вы можете очень легко использовать этот метод:

, поэтому при настройке просмотра текста отключите прокрутку

textView.isScrollEnabled = false

и затем в методе делегата func textViewDidChange(_ textView: UITextView) добавьте этот код:

func textViewDidChange(_ textView: UITextView) {
    let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
    textView.frame = CGRect(origin: textView.frame.origin, size: newSize)
}

Выходы:

enter image description here

enter image description here

4 голосов
/ 07 марта 2015

вот быстрая версия @ jhibberd

    let cell:MsgTableViewCell! = self.tableView.dequeueReusableCellWithIdentifier("MsgTableViewCell", forIndexPath: indexPath) as? MsgTableViewCell
    cell.msgText.text = self.items[indexPath.row]
    var fixedWidth:CGFloat = cell.msgText.frame.size.width
    var size:CGSize = CGSize(width: fixedWidth,height: CGFloat.max)
    var newSize:CGSize = cell.msgText.sizeThatFits(size)
    var newFrame:CGRect = cell.msgText.frame;
    newFrame.size = CGSizeMake(CGFloat(fmaxf(Float(newSize.width), Float(fixedWidth))), newSize.height);
    cell.msgText.frame = newFrame
    cell.msgText.frame.size = newSize        
    return cell
4 голосов
/ 10 января 2018

отключить прокрутку

добавить содержимое

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

[yourTextView setText:@"your text"];
[yourTextView layoutIfNeeded];

если вы используете UIScrollView, вы должны добавить это тоже;

[yourScrollView layoutIfNeeded];

-(void)viewDidAppear:(BOOL)animated{
    CGRect contentRect = CGRectZero;

    for (UIView *view in self.yourScrollView.subviews) {
         contentRect = CGRectUnion(contentRect, view.frame);
    }
    self.yourScrollView.contentSize = contentRect.size;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...