Я розміщую правильне рішення внизу сторінки, якщо хтось сміливий (або достатньо відчайдушний), щоб прочитати до цього моменту.
Ось gitHub repo для тих, хто не хоче читати весь цей текст: resizableTextView
Це працює з iOs7 (і я вірю, що він буде працювати з iOs8) і з авторозміткою. Вам не потрібні магічні номери, вимкнути макет та подібні речі. Коротке та елегантне рішення.
Я думаю, що весь код, пов'язаний з обмеженнями, повинен перейти до updateConstraints
методу. Отже, давайте зробимо своє ResizableTextView
.
Перша проблема, з якою ми зустрічаємось тут, полягає в тому, що не знаю реального розміру вмісту перед viewDidLoad
методом. Ми можемо пройти довгу і невдалу дорогу і обчислити її, виходячи з розміру шрифту, розривів рядків тощо. Але нам потрібно надійне рішення, тому ми зробимо:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Тож тепер ми знаємо справжній contentSize незалежно від того, де ми знаходимось: до чи після viewDidLoad
. Тепер додайте обмеження по висоті в textView (через розкадровку або код, незалежно від того, як). Ми будемо коригувати це значення за допомогою нашого contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
Останнє, що потрібно зробити, - це сказати суперкласу updateConstraints
.
[super updateConstraints];
Тепер наш клас виглядає так:
ResizableTextView.m
- (void) updateConstraints {
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
[super updateConstraints];
}
Гарненько і чисто, правда? І вам не доведеться мати справу з цим кодом у своїх контролерах !
Але зачекайте!
Y НІ АНІМАЦІЇ!
Ви можете легко анімувати зміни, щоб зробити textView
розтяжку плавно. Ось приклад:
[self.view layoutIfNeeded];
// do your own text change here.
self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
[self.infoTextView setNeedsUpdateConstraints];
[self.infoTextView updateConstraintsIfNeeded];
[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
[self.view layoutIfNeeded];
} completion:nil];