Для прошивки, вы можете сделать это следующим образом:
(1) Не забудьте установить UIImageView, чтобы получить взаимодействие с пользователем, а также добавить UITapGestureRecognizer в UIImageView.
myImageView.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer()
tapGesture.numberOfTapsRequired = 1
tapGesture.addTarget(self, action: #selector(tapDetected())
(2) Создайте новый CALayer, размер его, положение, и добавить его в слой с UIImageView в.
let tappableLayer = CALayer() // place this as a global variable
tappableLayer.frame = // give a CGRect size here, or you can make it a shape by declaring a UIBezierPath and making it a CAShapeLayer
myImageView.layer.addSublayer(tappableLayer)
(3) код функции tapDetected.
func tapDetected(_ recognizer:UITapGestureRecognizer) {
let p = recognizer.location(in: self)
if tappableLayer.hitTest(p) != nil {
// user tapped in your defined area of the image
}
}
Хороший ответ. Сначала я задавался вопросом, почему вы используете CALayer, а не просто CGRect, но возможность использовать разные формы для 'hitTest' потрясающая! – Kie
Метод hitTest() относится ко всем * CALayers. Если вы просто включили его для слоя myImageView, вы обнаружите весь вид. поэтому другая причина, по которой я не просто использовал CGRect, заключалась в том, что у этого метода нет метода hitTest(). – dfd
1. Я не вижу, как это относится к моему комплименту о вашем ответе, но истинная история! :) 2. Для этого можно использовать 'CGRectContainsPoint', я думаю. – Kie