0

これは少し奇妙で、一体何が起こっているのかわかりません。カスタム注釈が付いた MKMapView を使用しています。その注釈には、編集可能なテキスト フィールドがあります。ユーザーがフィールドをタップすると、キーボードが表示され、マップ ビューを移動/縮小し、注釈を中央に移動することで応答します。分割キーボードを備えたランドスケープ モードの iPad を除いて、すべて問題ありません。この状況でのみ、マップ ビューのフレームを変更すると、テキスト フィールドで「resignFirstResponder」が呼び出され、画面外でキーボードのアニメーションが開始されます。画面外に移動されると、コードはマップビューを移動/拡張してスペースを埋めることでそれに対応します。次に、テキスト フィールドがbecomeFirstResponder再びメッセージを受け取ります。コールスタックを確認しましたが、これは次のものから来ています:[UIView(Hierarchy) deferredBecomeFirstResponder]. キーボードが元に戻り、これに再び応答すると、上 -> 下 -> 上 -> 下 -> 上 -> 下...というサイクルが続きます。これresignFirstResponderは間違いなく、マップ ビューのフレームを設定することから来ています。テキスト フィールドにブレークを設定しresignFirstResponder、コール スタックを確認すると、前の呼び出しがマップ ビュー フレームの設定です。また、キーボードが閉じられたときにキーボードに応答するコードを壊すと、マップ ビュー フレームが設定された直後にスタックにこれらの呼び出しがあることに気付きます。

#6  0x001264cf in -[CTView resignFirstResponder]
#7  0x00e3bed7 in -[UIView setUserInteractionEnabled:] ()
#8  0x00710020 in ___lldb_unnamed_function213$$MapKit ()
#9  0x00714c14 in ___lldb_unnamed_function326$$MapKit ()
#10 0x00716f82 in ___lldb_unnamed_function361$$MapKit ()
#11 0x007168c4 in ___lldb_unnamed_function359$$MapKit ()
#12 0x00716068 in ___lldb_unnamed_function344$$MapKit ()
#13 0x00715c5c in ___lldb_unnamed_function343$$MapKit ()
#14 0x007198d0 in ___lldb_unnamed_function385$$MapKit ()
#15 0x0071a1ad in ___lldb_unnamed_function392$$MapKit ()
#16 0x0071a417 in ___lldb_unnamed_function396$$MapKit ()
#17 0x00711074 in ___lldb_unnamed_function255$$MapKit ()

マップ ビューのサイズを変更しないことで、これを回避できます。そうしないとサイクルが始まらない。代わりに、マップビューをコンテナービューに配置し、コンテナービューに設定clipToBounds = YESし、マップビューで自動サイズ変更を行わない場合、コンテナービューのサイズを変更して、マップビューを同じサイズのままにすることができます....問題は、それが回避策。ユーザーが iPad を回転させた場合、マップ ビューのサイズを変更する必要がありますが、それによってこの醜いサイクルが始まります。

何が起こっているのか知っている人はいますか?

4

2 に答える 2

0

サイズ変更中 MKMapView に、注釈の位置が画面外にあると計算し、現在最初の応答者であるMKAnnotationViewを含むものをダンプまたはフラグを立てる場合があります。UITextFieldこれにより、UITextFieldResignFirstResponder呼び出されます。サイズ変更後、UIKitUITextFieldはまだファーストレスポンダーである必要があると判断します。この特定の一連のアニメーションはUIKitがうまく処理できないエッジケースであるため、おそらくUITextFieldまだisFirstResponder==YESがあります。次に、UIKitはキーボードを表示し、コードをトリガーします。

UITextFieldから継承するメソッドを試してみましたUIResponderか?たぶん、アニメーションのサイズ変更中にcanResignFirstResponder == NOを設定しますか?

または、これが表示されるべきではないというMKMapView計算によってトリガーされた場合、注釈が表示範囲外として計算されないようにアニメーションを設定しようとしましたか?MKAnnotationView

于 2012-08-24T23:46:09.953 に答える
0

したがって、最終的に私が理解できる唯一の解決策は、テキストフィールドを MKMapView のサブビューとして削除し、MKMapView のスーパービューに配置することでした。私が知る限り、MKMapView のサブビューをファーストレスポンダーにするのは得策ではありません。MKMapView には、フレーム変更のファーストレスポンダ ステータスを「盗む」傾向があります。これにより、UIKeyboardNotifications に応答している場合、奇妙な応答サイクルが発生する可能性があります。

いずれにせよ、マップ ビューからテキスト フィールドを削除したことで、UI エクスペリエンスが少し向上しました。変化をアニメーション化することで、ユーザーは「このマップを操作している」から「このテキスト フィールドを編集している」への移行をより確実に体験しました。編集中にマップを無効にすると、これも強化されます。もう少し手間がかかりましたが、最終的には価値があることがわかりました。

于 2012-08-25T14:33:29.417 に答える