[Xcode] iOS 7 UITextViewの不具合対応 [追記あり]

表示が欠けるのと、一番下の行が隠れてしまう問題の対応。


2014.9.10 追記
以下の方法は、iOS 7まで有効です。
UITextViewのscrollEnabledは現状使ってはいけません。
うちのアプリは、ある機能のために全文置き換えをする必要がありましたが、単に文字列を置き換えるのは

- (void)replaceRange:(UITextRange *)range withText:(NSString *)text

を使うのが無難です。


iOS7の不具合と思われる現象です。

iOSの更新を待っているのも、解決が遅くなるため、先日対応しました。

試してみたら改善した という感じな点もあるので、アプリに適用するかはその点も考慮してください。

表示が欠ける問題

20131129-132959.jpg

文字表示が自動改行される場合に発生。

文字を、独自キーボードやボタン処理などから、直接文章に挿入した場合、表示が自動改行される場合に 100% 発生します。

挿入後、以下のちょっとした操作で改善します。

textView.scrollEnabled =NO;
textView.scrollEnabled =YES;

この2行で問題は改善しますが、かなりのおまじない的なため、rangeの再設定もなんとなく入れておきます。

NSRange range = textView.selectedRange;
textView.scrollEnabled =NO;
range.length=0;
textView.selectedRange = range;
textView.scrollEnabled =YES;

文字挿入後の scrollEnabled=YES をdelay実行しても関係なく、その後に NO→YES を必ず呼ばないといけない。

とはいえ、おまじないには変わりないです。

最後の行が隠れてしまう

20131129-133011.jpg

この問題はDeveloper Forumsに解決案が載っていたのを参考に。

UITextViewのサブクラスを作って、
scrollRangeToVisibleのオーバーライド。

- (void)scrollRangeToVisible:(NSRange)range
{
    [super scrollRangeToVisible:range];
    
    if(iOS7以降の場合){
        if ( (self.layoutManager.extraLineFragmentTextContainer != nil) && (self.selectedRange.location == range.location) )
        {
            CGRect caretRect = [self caretRectForPosition:self.selectedTextRange.start];
            [self scrollRectToVisible:caretRect animated:YES];
        }
    }
}

そのうちiOS7のマイナーアップデートで改善するとは思いますが。

記事内のアプリはこちら。
半角カナ+ うんたか

シェアする

  • このエントリーをはてなブックマークに追加

フォロミー

コメント

  1. たろう より:

    修正方法がわかり、助かりました。

コメントをどうぞ

メールアドレスが公開されることはありません。