■問題
この問題が発生するのは、以下の条件を満たしたときです。
- UITableView の cell の中に UITextView を配置する。
- UITextView に、縦スクロールが発生するぐらい長い文字列を入力する。
- UITextView の中ほどにカーソルを移動する。
- UITableView と UITextView の scrollEnabled プロパティを NO に設定する。
- UITextView の text プロパティを変更する。
カスタムキーボードを用意したり、本文中のURLを短縮して差し替えたりなど、結構 UITextView の text プロパティを直接書き換えたい要件があったりするので、このままでは困ります。
■解決方法
そこで、相当な荒技ですが、以下のようにして解決を図ることが可能です。
- UITableView の cell の中に UITextView を配置する。
- UITextView をいったん removeFromSuperview する。
- UITextView をいったん UITableView 以外の場所に addSubview する。
- UIWindow の直下などがおすすめ。
- UITextView の scrollEnabled プロパティを NO に設定する。
- UITextView の text プロパティを変更する。
- UITextView の scrollEnabled プロパティを YES に設定する。
- UITextView を元の view に addSubview する。
- UITextView を first responder にする。
UIView *parentView = textView.superview;こうすることで, UITableView が勝手にスクロールしてしまう問題を回避することが可能です。
[self.view.window addSubview:textView];
textView.scrollEnabled = NO;
textView.text = [currentText stringByReplacingCharactersInRange:selectedRange withString:shrunkenURLString];
textView.selectedRange = NSMakeRange(selectedRange.location + [shrunkenURLString length], 0);
textView.scrollEnabled = YES;
[parentView addSubview:textView];
[textView becomeFirstResponder];