Я использую iOS7.Проблема при попытке изменить динамическую высоту UITextView
Я хочу динамически изменять высоту моего UITextView в соответствии с высотой содержимого. Тем не менее, я нахожусь в iOS7, contentSize - беспорядок. Например, когда я удаляю строку, contentSize не изменится, но я ожидаю, что ее высота уменьшится.
Итак, я пишу следующее
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
// increase a line
if ([text isEqualToString:@"\n"]) {
_FRAME_SET_H(textView, textView.contentSize.height + 24.0f);
// decrease a line
} else if (range.length == 1 && [textView.text hasSuffix:@"\n"]) {
_FRAME_SET_H(textView, textView.contentSize.height - 24.0f);
} else {
_FRAME_SET_H(textView, textView.contentSize.height);
}
return YES;
}
Все работает отлично, пока я ввода очень длинный текст:
contentSize не изменится, если текст достаточно долго, чтобы вызвать автоматическое изменение строки!
Может ли кто-нибудь мне помочь?
Что я хочу просто: измените высоту UITextView в соответствии с его содержимым. Тем не менее, я потратил на него более двух дней, но до сих пор не решил.
UITextView в iOS7 является такой ошибкой.
Я попытался выполнить решение Uptown Apps. Ниже приводится мой новый код (немного изменился для моего другого проекта):
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
return YES;
}
- (void)textViewDidChange:(UITextView *)textView {
CGRect rect = [textView.text
boundingRectWithSize:CGSizeMake(300, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: textView.font}
context:nil];
_FRAME_SET_H(textView, rect.size.height);
_FRAME_SET_H(self, _FRAME_H(textView) + _BLOCK_PADDING * 2);
}
Однако проблема остается. На следующем изображении белый прямоугольник является UITextView, а черный фон - его надписью.
Когда я запустить приложение, высота UITextView является 0, и экран выглядит следующим образом:
Тогда я типа «А», экран превращается в:
Вы видите есть две проблемы: 1) высоты недостаточно. 2) каретка странная!
Тогда я набираю еще немного «а», экран превращается в:
Тогда я типа «возврат», чтобы изменить линию, экран превращается в:
Да, не меняется! Но я ожидаю, что он увеличит свою высоту, включив новую пустую строку.
Тогда я типа «A», экран не превращается в:
Высота увеличивается, но новый текст не отображается, ни в каретку. Я думаю, это также связано с тем, что высоты недостаточно.
Тогда я типа другой 'а', экран превращается в: появляются
Letters, но только половина ...
Кстати, когда я использую UILabel, я могу получить правильную высоту текста, используя этот метод !!!! (Т.е. вызова boundingRectWithSize :)
Я обновил свое сообщение, пожалуйста, обратитесь к нему. – HanXu
Я думаю, что у вас может быть ошибка в вашей функции _FRAME_SET_H. Вы пытаетесь расширить текст вверх (нравится приложение «Сообщения»)? Мой код этого не делает, но может быть адаптирован для этого. –
Вау, я должен был это увидеть раньше. После того, как вы измените текст, вы можете использовать размер содержимого, как вы хотели. См. Http://stackoverflow.com/questions/50467/how-do-i-size-a-uitextview-to-its-content. Единственное, что вам нужно учитывать, - это максимальная высота и прокрутка представления, когда вы нажмите максимальную высоту и введите символ новой строки (возврат), но не ввели новый текст. –