UIView
サブクラスの場合はfunc point(inside point: CGPoint, with event: UIEvent?) -> Bool
をオーバーライドするのが最も正しい方法です。ここで
は一例です:
class CustomView: UIView {
private let shapeLayer = CAShapeLayer()
override init(frame: CGRect) {
super.init(frame: frame)
setupShapeLayer()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupShapeLayer() {
//Draw your own shape here
shapeLayer.frame = CGRect(x: 0, y: 0, width: frame.width, height: frame.height)
let innerPath = UIBezierPath(arcCenter: center, radius: frame.width/3, startAngle: CGFloat(0), endAngle: CGFloat.pi * 2, clockwise: true)
let outerPath = UIBezierPath(arcCenter: center, radius: frame.width/4, startAngle: CGFloat(0), endAngle: CGFloat.pi * 2, clockwise: true)
//Subtract inner path
innerPath.append(outerPath.reversing())
shapeLayer.path = innerPath.cgPath
shapeLayer.lineWidth = 10
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.fillColor = UIColor.yellow.cgColor
layer.addSublayer(shapeLayer)
}
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return shapeLayer.path?.contains(point) ?? false
}
}
今、あなたはそれがどのように動作するか確認するためにUITapGestureRecognizer
を追加することができます。tapAction
の
class ViewController: UIViewController {
@IBOutlet weak var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let customView = CustomView.init(frame: view.frame)
view.addSubview(customView)
let recognizer = UITapGestureRecognizer(target: self, action: #selector(tapAction))
view.addGestureRecognizer(recognizer)
}
@objc func tapAction(_ sender: UITapGestureRecognizer) {
let location = sender.location(in: sender.view)
let subview = view?.hitTest(location, with: nil)
if subview is CustomView {
resultLabel.text = "CustomView"
}
else {
resultLabel.text = "Other"
}
}
}
結果:
![enter image description here](https://i.stack.imgur.com/q4BKk.png)
を使用すると、複数のが必要な場合ビュー、2つのオプティオがありますNS:point
関数内1 CustomView
内部
- ストア
CAShapeLayer
し、それを反復処理
- は、インスタンスごとに
CustomView
を追加し、UITapGestureRecognizer
タップアクション内
出典
2017-11-13 11:50:22
Leo
それを反復処理するだけ無効にユーザーとの対話と小さいビューを置きますビューの前に – the4kman
その場合、他のビューはトップビューになるとクリックできません 私の質問を編集しました。iamgeをご覧ください。 –
何か試しましたか?ビューをタップするコードはどこにありますか? –