UITextView contentSize-Änderungen und NSLayoutManager in iOS7
Das Problem:UITextView
im stillen ändert escontentSize
in einigen Situationen.
Der einfachste Fall textView mit großem Text und Tastatur. Einfach UITextView-Ausgang hinzufügen und einstellen- viewDidLoad
wie:
- (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);
}
Das Anzeigen und Ausblenden der Tastatur führt in einigen Fällen zu Textsprüngen.
Ich habe den Grund gefunden, nach Unterklassen zu springenUITextView
. Die einzige Methode in meiner Unterklasse ist:
- (void)setContentSize:(CGSize)contentSize {
NSLog(@"CS: %@", NSStringFromCGSize(contentSize));
[super setContentSize:contentSize];
}
Und es zeigtcontentSize
schrumpft und dehnt sich beim Ausblenden der Tastatur aus. Etwas wie das:
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}
Sieht aus wie Verhalten vonUITextView
wurde viel in iOS7 geändert. Und jetzt sind einige Dinge kaputt.
Als ich weiter entdeckte, fand ich das neulayoutManager
Die Eigenschaft meiner Textansicht ändert sich ebenfalls. Es gibt einige interessante Infos im Log:
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
Und nächste Zeile mit contentSize ={320, 885}
enthältLayout tree contents: ..., 2127 laid glyphs, 51 laid line fragments
. Es sieht also so aus, als würde eine Art Autolayout versuchen, TextView auf der Tastatur neu zu formatieren und ContentSize zu ändern, auch wenn das Layout noch nicht fertig ist. Und es läuft auch, wenn meine Textansicht nicht zwischen Tastatur einblenden / ausblenden wechselt.
Die Frage ist: Wie vermeide ich ContentSize-Änderungen?