Middle
Kaip galima nustatyti, ar naudotojas paspaudė sluoksnį (layer)?
sobes.tech AI
Atsakymas iš AI
Galima naudoti hit testing: nustatyti, į kurį sluoksnį pateko prisilietimas. Core Animation siūlo du metodus šiam tikslui:
-
hitTest(_:):- Patikrina, ar taškas yra sluoksnio ribose arba bet kurio iš jo pavaldinių sluoksnių viduje.
- Grąžina giliausią pavaldinį sluoksnį (arba patį sluoksnį), kuris apima tašką.
- Laiko
isHidden = true.
-
contains(_:):- Patikrina tik, ar taškas yra paties sluoksnio ribose.
- Nelaiko hierarchijos.
- Nelaiko
isHidden.
Dažniausiai naudojamas hitTest, nes jis tikslesnis interaktyvumo nustatymui.
Pavyzdys, kaip naudoti hitTest prisilietimo apdorojimui:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let locationInView = touch.location(in: view)
// Konvertuojame tašką iš `UIView` koordinačių į sluoksnio koordinates
let locationInLayer = myLayer.convert(locationInView, from: view.layer)
// Atlikti hit test
if let hitLayer = myLayer.hitTest(locationInLayer) {
if hitLayer === myLayer {
// Paspausta būtent ant myLayer
print("Paspausta ant myLayer")
} else {
// Paspausta ant pavaldinio sluoksnio
print("Paspausta ant pavaldinio sluoksnio")
// Pavaldinio identifikacija gali reikalauti papildomų patikrinimų
}
} else {
// Paspausta už myLayer ir jo pavaldinių ribų
print("Paspausta už myLayer")
}
}
Svarbūs punktai:
- Prisilietimo taško koordinates (
location(in:)) visada susietos suUIView. Jas būtina konvertuoti į sluoksnio koordinačių sistemą (convert(_, from:)arbaconvert(_, to:)). hitTest(_:)metodas veikia su taškais sluoksnio koordinačių sistemoje (myLayer.hitTest(locationInLayer)).- Jei sluoksnis nematomas (
alpha = 0arbaisHidden = true),hitTestgrąžinsnil.containsgrąžinstrue, jei taškas yra ribose, nepaisant matomumo. - Sudėtingai hierarchijai gali prireikti rekursinio paieškos arba grąžinto
hitLayerpatikrinimo.