これまで同様の質問がありましたが、Capturing touches on a subview outside the frame of its superview using hitTest:withEvent:とDelivering touch events to a view outside the bounds of its parent viewを参照しました。しかし、彼らは私の特定の問題に答えるようには思われません。範囲外のタッチイベントを受信
私は次のような構造を持つカスタムコントロールを持っている:
+-------------------------------+
| UIButton |
+-------------------------------+
| |
| |
| UITableView |
| |
| |
+------------------------- +
カスタムコントロールはUIButton
サブクラスをオーバーライドし、そのサブビューとしてUITableView
を追加します。考え方は、コントロール全体をドロップダウンのように動作させることです。 UIButton
を押すと、UITableView
がドロップダウンされ、選択肢の選択が可能になります。
このすべてのコントロールが最上位UIView
の直接の子である場合、上記のAppleのQ &リンクで説明したようにUIButton
でオーバーライドhitTest
で正常に動作します。ただし、コントロールが別のビュー階層にある場合、UITableView
はタッチイベントを受け取りません。
次は、使用hitTestコードです:
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
// Convert the point to the target view's coordinate system.
// The target view isn't necessarily the immediate subview
let pointForTargetView = self.spinnerTableView.convertPoint(point, fromView:self)
if (CGRectContainsPoint(self.spinnerTableView.bounds, pointForTargetView)) {
// The target view may have its view hierarchy,
// so call its hitTest method to return the right hit-test view
return self.spinnerTableView.hitTest(pointForTargetView, withEvent:event);
}
return super.hitTest(point, withEvent: event)
}
編集:
私は、答えを見て、彼らは問題を解決するかどうかを確認することができていたではないため、いくつかのために謝罪すぐに注意を必要とする他のタスク。私はそれらを確認し、助けるものを受け入れます。お待ち頂きまして、ありがとうございます。
いいえ、以前の実装の問題点は、ポイントが 'UITableView'座標系に正しく変換されていないことでした。したがって、上記の場合でさえ、 'CGRectContainsPoint'は、' UITableView'境界内にあるポイントを特定しません。 – Rajesh
私は自分の答えを更新しました。 –
ありがとう、私はこれを行うには一般的な方法が必要です。コントロールがある階層レベルの数にかかわらず、 – Rajesh