UITextView zmiany contentSize i NSLayoutManager w iOS7

Problem:UITextView cicho to zmieniacontentSize w niektórych sytuacjach.

Najprostszy tekst sprawyZobacz duży tekst i klawiaturę. Po prostu dodaj ujście i ustaw UITextView- viewDidLoad tak jak:

- (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);
}

Teraz pokazywanie i ukrywanie klawiatury spowoduje w niektórych przypadkach skoki tekstu.

Znalazłem powód skakania przez podklasęUITextView. Jedyną metodą w mojej podklasie jest:

- (void)setContentSize:(CGSize)contentSize {
    NSLog(@"CS: %@", NSStringFromCGSize(contentSize));
    [super setContentSize:contentSize];
}

I to widaćcontentSize kurczy się i rozszerza na klawiaturze. Coś takiego:

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}

Wygląda na zachowanieUITextView bardzo się zmieniło w iOS7. A teraz niektóre rzeczy są zepsute.

Odkrywając to, odkryłem to nowelayoutManager właściwość mojego textView też się zmienia. W dzienniku znajduje się kilka interesujących informacji:

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

I następny wiersz z contentSize ={320, 885} zawieraLayout tree contents: ..., 2127 laid glyphs, 51 laid line fragments. Wygląda to na rodzaj autolayoutu, który próbuje zmienić układ textView na klawiaturze i zmienia contentSize, nawet jeśli układ nie został jeszcze ukończony. I działa nawet wtedy, gdy mój textView nie zmienia się pomiędzy klawiaturą show / hide.

Pytanie brzmi: jak zapobiegać zmianom treści?

questionAnswers(3)

yourAnswerToTheQuestion