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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage