Middle
Колдонуучу катмарга (layer) басканын кантип аныктоого болот?
sobes.tech AI
AIден жооп
Можна колдонушу мүмкүн hit testing: кайсы катмарга тийгенин аныктоо. 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 {
// Менчик катмарга тийди
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),hitTestnilкайтарат.containsболсо, чекит чегинде болсо,trueкайтарат, көрүнбөстөн карабастан. - Катмардардын татаал иерархиясы үчүн рекурсивдүү издөө же кайтарылган
hitLayerтекшерүү керек болушу мүмкүн.