これまでオンラインで満足のいく解決策を見つけることができませんでした (Apple はこの問題を無視しているようです)。Apple の開発者フォーラムで、役立つかもしれないいくつかの提案を含むスレッドを見つけました: UIScrollView: 'delaysContentTouches' は無視されました
このリンクの回避策を使用できました。回避策を要約するには(ここでパラ引用しています):
UIEvent オブジェクトにはタイム スタンプが含まれています。
埋め込みサブビューで touchesBegan の時点でタイムスタンプを記録できます
。
scrollView のサブビューの touchesMoved で、タイムスタンプと場所をもう一度確認します。
タッチがあまり動かず、たとえば 0.1 秒以上経過している場合、ユーザーがサブビューにタッチしてから動きを遅らせたと見なすことができます。
この場合、UIScrollView は、これがスクロール アクションではないことを独立して判断しますが、そのことをユーザーに通知することはありません。
したがって、ローカル状態変数を使用して、この遅延移動の状態が発生したことをフラグし、サブビューによって受信されたイベントを処理できます。
これが私のコードです:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
// store the timestamp
_beginDragTimeStamp = event.timestamp;
// your embedded subview's touches begin code
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
// compare and ignore drag if time passed between tap and drag is less than 0.5s
if(event.timestamp - _beginDragTimeStamp < 0.5) return;
// your drag code
}