UITextView sizeToFit не работает

Странно, я везде искал этот ответ, но, похоже, ничего не работает!

У меня простой UITextView что я пытаюсь изменить размер в viewController в соответствии с его содержимым:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *lorum = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.";

    self.textView.text = lorum;

    self.textView.scrollEnabled = NO;
    [self.textView sizeToFit];
    [self.textView layoutIfNeeded];
}

Но это все, чем я заканчиваю:

Я что-то упускаю из виду?

ОБНОВЛЕНО (фон рамки):

4 ответа

Решение

Как я написал в комментарии, по моему мнению, если вы не хотите использовать прокрутку UITextView, я предлагаю использовать простой UILabel.. это код:

РЕДАКТИРОВАТЬ: если вы хотите использовать UITextView по какой-то причине, например, редактируемый текст или выбираемый текст, вы можете использовать один и тот же код с некоторыми изменениями (я добавляю эти изменения в коде, как комментарии)

РЕДАКТИРОВАТЬ2, если ваш ярлык находится в раскадровке, проверьте ограничения или удалите автопоставку

.час

  @interface ViewController : UIViewController {

    IBOutlet UILabel *label;

   }

.m

 - (void)viewDidLoad {
   [super viewDidLoad];

 //  UILabel *label = [[UILabel alloc] init];
   label.backgroundColor = [UIColor lightGrayColor];

   NSString *lorum = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.";

   //for use labrect with UITextView you set the font of UITextView:
   //label.font = [UIFont systemFontOfSize:17];       

   CGSize maxSize = CGSizeMake(320, 410);
   CGRect labrect = [lorum boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:label.font} context:Nil];

   label.text = lorum;
   //for use UITextView you should comment the line under
   label.numberOfLines = 0;
   label.frame = CGRectMake(0, 30, 320, labrect.size.height);

 //  [self.view addSubview:label];

  };

https://medium.com/ios-os-x-development/102e73853fbc

Посмотрите на это решение. Это сработало для меня!

Все, что вам нужно сделать, это добавить ограничение высоты на раскадровку с выходом в вашем контроллере представления. Затем добавьте следующие строки в метод viewDidAppear:

CGSize size = self.textView.contentSize; self.textViewHeightConstraint.constant = size.height;

Существует пример проекта, если вы перейдете по ссылке.

Вы пытались использовать UIViewContentMode?

Например:

[self.textView setContentMode:UIViewContentModeScaleToFill];

Попробуйте отрегулировать размер кадра вручную.

self.textView.text = lorum;
CGSize size = [lorum sizeWithFont:self.textView.font
                         constrainedToSize:CGSizeMake(self.textView.frame.size.width, 9999)
                             lineBreakMode:UILineBreakModeWordWrap];
CGRect frame = self.textView.frame;
frame.size.width = size.width;
frame.size.height = size.height;
self.textView.frame = frame;

Это должно установить размер вашего textview к размеру текста (ограниченный шириной вашего textView). Происхождение должно остаться прежним.

Насколько я знаю sizeToFit только сжимает кадр, он не будет расширять его. Таким образом, если ваш фрейм изначально имеет высоту всего одну строку, он останется только на одну строку

В качестве альтернативы, вы можете установить рамку textView на все ваше окно, затем использовать sizeToFit, и это должно работать правильно.

РЕДАКТИРОВАТЬ:

Чтобы избежать устаревшей функции, вы также можете использовать

CGSize size = [lorum sizeWithAttributes:@{NSFontAttributeName:self.textView.font}];

или же

CGRect rect = [text boundingRectWithSize:(CGSize){ .width = self.textView.frame.size.width, .height = CGFLOAT_MAX } options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName = self.textView.font } context:nil];
Другие вопросы по тегам