iOS5で遭遇する問題のようです。iOS6では発生しませんでした。
ちょっとマニアックなところかもしれませんが、はまると結構嫌な部分なのでシェアします。
動作上の問題
例えば、UIScrollViewの上にUITableViewを乗せている状態で、UITextViewがFirstResponderの時は入力しやすいように位置を修正しているにもかからわず、コード上でbecomesFirstResponder
と指定すると、勝手にUITextViewの最後の文字のところが表示領域最下部になるようにスクロールしてしまう。
原因
UIScrollView上のViewがプログラム上でfirstResponderになった場合、UIScrollViewの、scrollRectToVisible: animated:
が呼ばれて自動でスクロールしてしまう。
解決方法
該当のUIScrollViewを継承してscrollRectToVisible: animated:
をオーバーライドして空にする(とりあえずFirstResponderになった時にこのメソッドが反応しないようにします。あとはご自由に)。
// 動作を無視するためにオーバーライド - (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated { /* 空にする */ }
UIScrollViewのサブクラスの中身はこれだけです。いやぁ、解決してよかった!