Middle
Как може да се определи дали потребителят е натиснал слой (layer)?
sobes.tech AI
Отговор от AI
Може да използвате тест за удар: определяне на точно на кой слой е станало докосването. 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)
// Преобразуваме точката от координатите на изгледа към координатите на слоя
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.