Ответ
Непосредственно CALayer не обрабатывает события касаний. Система событий UIKit (UIResponder) работает с UIView. Однако есть несколько обходных путей:
1. Использование родительского UIView Наиболее правильный способ — обрабатывать события во View, содержащей слой, и проверять, попадает ли точка касания в слой.
class TouchableView: UIView {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let point = touch.location(in: self)
// Проверяем, попадает ли точка в слой
if let sublayer = layer.sublayers?.first, sublayer.hitTest(point) != nil {
print("Tap on layer detected")
}
}
}
2. Метод hitTest(_:)
Можно переопределить hitTest у родительской View, чтобы определить, было ли касание в пределах слоя.
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
// Конвертируем точку в координаты слоя
let layerPoint = convert(point, to: myCustomLayer)
// Проверяем, содержит ли слой эту точку
if myCustomLayer.contains(layerPoint) {
return self // Возвращаем View для обработки события
}
return super.hitTest(point, with: event)
}
3. Добавление UITapGestureRecognizer Добавьте распознаватель жестов к родительской View и проверяйте положение касания.
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tapRecognizer)
@objc func handleTap(_ gesture: UITapGestureRecognizer) {
let point = gesture.location(in: view)
if myCustomLayer.frame.contains(point) {
// Обработка тапа по слою
}
}
Рекомендация: Если требуется полноценная интерактивность (тапы, свайпы), используйте UIView или кастомную UIControl. CALayer предназначен в первую очередь для отрисовки и анимации.