Sobes.tech
Middle

Колдонуучу катмарга (layer) басканын кантип аныктоого болот?

sobes.tech AI

AIден жооп

Можна колдонушу мүмкүн hit testing: кайсы катмарга тийгенин аныктоо. Core Animation эки ыкманы сунуштайт:

  1. hitTest(_:):

    • Точка катмардын чегинен тышкары же анын бардык алдындагы катмарлардын ичинде экенин текшерет.
    • Төмөнкү катмарды (же өзү катмарды) кайтарат, ал точкага ээ.
    • isHidden = true эске алынат.
  2. 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), hitTest nil кайтарат. contains болсо, чекит чегинде болсо, true кайтарат, көрүнбөстөн карабастан.
  • Катмардардын татаал иерархиясы үчүн рекурсивдүү издөө же кайтарылган hitLayer текшерүү керек болушу мүмкүн.