Middle
Kako odrediti da li je korisnik kliknuo na sloj (layer)?
sobes.tech АИ
Одговор од АИ
Можете да использовать тестирование попадения: определить, на каком именно слое произошло касание. Core Animation предоставляет для этого два метода:
-
hitTest(_:):- Проверяет, находится ли точка внутри границ слоя или любого из его подслоёв.
- Возвращает самый глубокий подслой (или сам слой), содержащий точку.
- Учитывает
isHidden = true.
-
contains(_:):- Проверяет только, находится ли точка внутри границ самого слоя.
- Не учитывает иерархию подслоёв.
- Не учитывает
isHidden.
Обычно используется hitTest, так как он более точен для определения интерактивности.
Пример использования hitTest в обработчике касаний:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let locationInView = touch.location(in: view)
// Преобразуем точку из координат view в координаты слоя
let locationInLayer = myLayer.convert(locationInView, from: view.layer)
// Выполняем hit test
if let hitLayer = myLayer.hitTest(locationInLayer) {
if hitLayer === myLayer {
// Коснулись именно myLayer
print("Коснулись myLayer")
} else {
// Коснулись подслоя внутри myLayer
print("Коснулись подслоя внутри myLayer")
// Идентификация подслоя может потребовать дополнительных проверок
}
} else {
// Коснулись вне myLayer и его подслоёв
print("Коснулись вне myLayer")
}
}
Важные моменты:
- Координаты точки касания (
location(in:)) всегда привязаны кUIView. Необходимо преобразовать их в систему координат слоя (convert(_, from:)илиconvert(_, to:)). - Метод
hitTest(_:)работает с точками в системе координат вызывающего слоя (myLayer.hitTest(locationInLayer)). - Если слой невидим (
alpha = 0илиisHidden = true),hitTestвернётnil.containsвернётtrue, если точка внутри границ, игнорируя видимость. - Для сложных иерархий слоёв может потребоваться рекурсивный поиск или проверка возвращённого
hitLayer.