Sobes.tech
Middle

Kā noteikt, vai lietotājs ir noklikšķinājis uz slāņa (layer)?

sobes.tech AI

Atbilde no AI

Var izmantot hit testing: noteikt, uz kuru slāni ir nonācis pieskāriens. Core Animation piedāvā divas metodes šim nolūkam:

  1. hitTest(_:):

    • Pārbauda, vai punkts atrodas slāņa robežās vai jebkura tā apakšslāņa iekšienē.
    • Atgriež visdziļāko apakšslāni (vai pašu slāni), kas satur punktu.
    • Ņem vērā isHidden = true.
  2. contains(_:):

    • Pārbauda tikai, vai punkts ir paša slāņa robežās.
    • Negalvo hierarhiju.
    • Negalvo isHidden.

Parasti tiek izmantots hitTest, jo tas ir precīzāks interaktivitātes noteikšanā.

Piemērs, kā izmantot hitTest pieskāriena apstrādē:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else { return }

    let locationInView = touch.location(in: view)

    // Pārvērš punktu no `UIView` koordinātām uz slāņa koordinātām
    let locationInLayer = myLayer.convert(locationInView, from: view.layer)

    // Veikt hit test
    if let hitLayer = myLayer.hitTest(locationInLayer) {
        if hitLayer === myLayer {
            // Pieskāriens tieši uz myLayer
            print("Nospieda uz myLayer")
        } else {
            // Pieskāriens uz apakšslāņa iekšienē
            print("Nospieda uz apakšslāņa")
            // Apakšslāņa identifikācija var prasīt papildu pārbaudes
        }
    } else {
        // Pieskāriens ārpus myLayer un tā apakšslāņiem
        print("Nospieda ārpus myLayer")
    }
}

Svarīgi punkti:

  • Pieskāriena punkta koordinātas (location(in:)) vienmēr ir saistītas ar UIView. Tās ir jākonvertē uz slāņa koordinātu sistēmu (convert(_, from:) vai convert(_, to:)).
  • hitTest(_:) metode darbojas ar punktiem slāņa koordinātu sistēmā (myLayer.hitTest(locationInLayer)).
  • Ja slānis ir neredzams (alpha = 0 vai isHidden = true), hitTest atgriezīs nil. contains atgriezīs true, ja punkts ir iekšā robežās, ignorējot redzamību.
  • Sarežģītākai hierarhijai var būt nepieciešama rekursīva meklēšana vai pārbaude ar atgriezto hitLayer.