Sobes.tech
Middle

Чӣ гуна муайян кардан мумкин аст, ки корбар ба қабат (layer) клик кардааст?

sobes.tech AI

Ҷавоб аз AI

Можна выкарыстоўваць тэставанне ўдару: вызначыць, у які менавіта слой трапіла дакрананне. 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 {
            // Дакрануліся менавіта да 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.