[iOS] iOS8,iOS7にてUITextViewで最後の行をTapするとTopにScrollする現象(ぶっ飛び怪奇現象)の回避方法

我らが大好きUITextViewは、iOS7からたまに挙動がおかしくなると有名ですね(こっちの頭もおかしくなりそう)。それはNSLayoutManager周りが一新されたためなのですが、古いコードで動いているアプリだと、そのおかしな挙動に頭を悩まされます。そんな中の一つをメモとして残します。そう、自分のために。

スクロールできるくらいのテキストをあらかじめセットした状態で、最後の行の後ろにテキストを挿入しようとすると、TopにScrollされます。(ぶっ飛び怪奇現象)
↓こんな感じですね。

・「allowsNonContiguousLayout=YES」にした場合

これは、NSLayoutManagerのallowsNonContiguousLayoutがdefaultでtrueになっており、どうやらそれが今回の悪さをするようです。allowsNonContiguousLayoutをfalseにしてみると、怪奇現象はおきません。

・「allowsNonContiguousLayout=NO」にした場合

[code]
UITextView *textView = [UITextView new];
textView.delegate = self;
textView.frame = CGRectMake(0, self.view.bounds.size.height/3, self.view.bounds.size.width, 100);
textView.backgroundColor = [UIColor lightGrayColor];
textView.font = [UIFont systemFontOfSize:20];
textView.text = @”ABC\nD\nD\nD\nD\nD\nD\nD\nEFG”;

// これを追加
// textView.layoutManager.allowsNonContiguousLayout = NO;

[self.view addSubview:textView];
[/code]

githubにもアップしておきました。自分のために。
https://github.com/hayakawatomoaki/iOS8_STextView

検索されやすいように英語でも書いておきます。
文法が間違っていても気にしません。
Scroll to top When tapped last line of UITextView…

上記、間違っていたら教えてくれると助かります。
ではでは。