2012-07-17 2 views
6

iPhoneのAppleのメッセージアプリに似たUIを作成したいと考えています。私はそれの下にテーブルビューとテキストフィールドを持っています。テキストフィールドを選択すると、キーボードの上にコンテンツがキーボード上に表示されるように、テーブルビューのcontentInsetをアニメーション化します。contentOffsetを変更せずにUITableViewのcontentInsetを変更しますか?

私はパンジェスチャ認識機能を使用して、ユーザーがテーブルビューをスクロールしているときを検出し、キーボードがアニメーション表示されるようにするコードをいくつか持っています(Appleのメッセージアプリが表示されている場合、キーボードを閉じる機能あなたはテーブルビューを下にスクロールし、指がスライドしてテキストフィールドを通り過ぎると、キーボードはそれに合わせて下がります)。

これはうまくいきますが、テーブルビューが一番上にスクロールされ、キーボードのスライドに合わせてコンテンツのインセットを変更すると、テーブルビューが一番上をスクロールして上にスナップして、 。これは、contentInsetを変更すると、テーブルビューが上をスクロールして、それが奇妙な動作をしている場合、contentOffsetをテーブルビューの先頭にリセットするためです。

contentOffsetを変更せずにスクロールビューのcontentInsetを変更する方法を知っている人はいますか?

答えて

7

小さな回避策ですべてを完全に動作させることができました。 contentOffsetが一番上にあったか、またはトップを過ぎてスクロールした場合にインセットが変更されないように

// in a method that gets repeatedly called as the pan gesture recognizer changes 
if([tableView contentOffset].y > 0) { 
    UIEdgeInsets insets = [tableView contentInsets]; 
    inset.bottom = currentKeyboardHeight; 
    [tableView setContentInset:inset]; 
} 

:私はちょうどこれをしませんでした。テーブルが少し下にスクロールされてドラッグされた場合、上に当たるまでインセットが変更され、変更が停止して奇妙なちらつきが発生しなくなります。


編集:は、根本的な原因を考え出したし、私はこれを更新するだけではなく、回避策を残すだろうと思っていました。私がしていたことは、フレームの計算の途中でCGAffineTransformMakeTranslationを混ぜることでした。これはアップルの文書によれば大きなノー・ノーです。 transformプロパティがCGAffineTransformIdentityではない場合、frameは未定義となり、テーブルビューをスクロールしてコンテンツインセットを同時に変更すると、これは非常に奇妙な動作を引き起こします。

関連する問題