これは少し奇妙で、一体何が起こっているのかわかりません。カスタム注釈が付いた 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 を回転させた場合、マップ ビューのサイズを変更する必要がありますが、それによってこの醜いサイクルが始まります。
何が起こっているのか知っている人はいますか?