Проблема: UITextView
бесшумно меняет это contentSize
в некоторых ситуациях.UITextView contentSize изменения и NSLayoutManager в iOS7
Простейший текстовый файл с большим текстом и клавиатурой. Просто добавьте выход UITextView и установить - viewDidLoad
как:
- (void)viewDidLoad {
[super viewDidLoad];
// expand default "Lorem..."
_textView.text = [NSString stringWithFormat:@"1%@\n\n2%@\n\n3%@\n\n4%@\n\n5", _textView.text, _textView.text, _textView.text, _textView.text];
_textView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
_textView.contentInset = UIEdgeInsetsMake(0, 0, 216, 0);
}
Теперь отображение и скрытие клавиатуры будет вызывать текст перескакивает в некоторых случаях.
Я нашел причину прыжка по подклассам UITextView
. Единственный способ в моем подкласса:
- (void)setContentSize:(CGSize)contentSize {
NSLog(@"CS: %@", NSStringFromCGSize(contentSize));
[super setContentSize:contentSize];
}
И показать contentSize
сжимается и расширяется на клавиатуре шкурой. Что-то вроде этого:
013-09-16 14:40:27.305 textView-bug2[11087:a0b] CS: {320, 651}
2013-09-16 14:40:27.313 textView-bug2[11087:a0b] CS: {320, 885}
2013-09-16 14:40:27.318 textView-bug2[11087:a0b] CS: {320, 902}
Похоже поведение UITextView
было изменено много в iOS7. И некоторые вещи сейчас сломаны.
Узнав об этом, я обнаружил, что новое свойство моего текстового изменения также появилось в моем новом объекте layoutManager
. Там некоторые интересные данные в журнале в настоящее время:
2013-09-16 14:41:59.352 textView-bug2[11115:a0b] CS: {320, 668}
<NSLayoutManager: 0x899e800>
1 containers, text backing has 2129 characters
Currently holding 2129 glyphs.
Glyph tree contents: 2129 characters, 2129 glyphs, 3 nodes, 96 node bytes, 5440 storage bytes, 5536 total bytes, 2.60 bytes per character, 2.60 bytes per glyph
Layout tree contents: 2129 characters, 2129 glyphs, 532 laid glyphs, 13 laid line fragments, 4 nodes, 128 node bytes, 1048 storage bytes, 1176 total bytes, 0.55 bytes per character, 0.55 bytes per glyph, 40.92 laid glyphs per laid line fragment, 90.46 bytes per laid line fragment
И следующая строка с contentSize = {320, 885}
содержит Layout tree contents: ..., 2127 laid glyphs, 51 laid line fragments
. Таким образом, похоже, что какой-то автозапуск пытается переделать textView на показе клавиатуры и изменить contentSize, даже если макет еще не закончен. И он работает, даже если мой textView не изменяется между клавиатурой show/hide.
Вопрос: как предотвратить изменения контента?
Я имею точно такой же вопрос :( – Legolas