Sobes.tech
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:

  1. 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.
  2. 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 su UIView. Jas būtina konvertuoti į sluoksnio koordinačių sistemą (convert(_, from:) arba convert(_, to:)).
  • hitTest(_:) metodas veikia su taškais sluoksnio koordinačių sistemoje (myLayer.hitTest(locationInLayer)).
  • Jei sluoksnis nematomas (alpha = 0 arba isHidden = true), hitTest grąžins nil. contains grąžins true, jei taškas yra ribose, nepaisant matomumo.
  • Sudėtingai hierarchijai gali prireikti rekursinio paieškos arba grąžinto hitLayer patikrinimo.