iOS11のコントロールセンター領域タッチ処理
アプリ上でiOS11.1から上部、下部のコントロールセンターにかかる領域の
タッチが反応しなくなるという現象が発生し、解決したのでメモ。
iOS11.1以前ではどこの領域でもタッチした瞬間、
タッチ開始イベントtouchesBeganが飛んで、
離した瞬間タッチ終了イベントtouchesEndedが飛んでいましたが、
iOS11.1以降では
コントロールセンター領域外:タッチした瞬間、touchesBeganが飛ぶ
コントロールセンター領域内:1秒程度タッチし続けた後にtouchesBeganが飛ぶ
という状況になったようです。
ちなみにコントロールセンター領域内でイベントが飛ぶ前に場合は
タッチを離した瞬間に、touchesBeganとtouchesEndedが同時に飛ぶ仕様に。
そのため、touchesBegan、touchesEndedをフックとしてキー処理を
行っていた箇所が軒並み想定外の動きをするという自体に陥りました。
この現象はメソッド
preferredScreenEdgesDeferringSystemGestures()
を使うことで解決しました。
https://developer.apple.com/documentation/uikit/uiviewcontroller/2887512-preferredscreenedgesdeferringsys
オーバーライドして指定した箇所の1回目のタッチをアプリ優先にすることができます。
// 画面下部をアプリ優先
(UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
return UIRectEdgeBottom;
}