Sobes.tech
Middle

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

sobes.tech AI

Ҷавоб аз AI

Барои муайян кардани пахш дар CALayer, метавон ба истифодаи чанд роҳ муроҷиат кард:

  1. Истифодаи hitTest(_:event:) дар намуд (View):

    • UIView дорои усули hitTest(_:with:) мебошад, ки ба таври рекурсивӣ ба иерархияи зернамоҳо мегузарад ва зернамоии амиқтаринро, ки нуқтаи додаашро дар бар мегирад, бармегардонад.
    • Ин усул ба таври пешфарз қабатҳои вобаста ба намудҳоро ба назар мегирад.
    • Шумо метавонед hitTest(_:with:)-ро дар намуди худи махсус барои назорати бештар ё барои коркарди пахшҳо мустақиман дар зернамоҳо барқарор кунед.
  2. Трансформатсияи координатҳо бо convert:

    • Вақте ки шумо рӯ ба рӯи ҳодисаи тамос (масалан, дар методҳои UIView) қарор мегиред, шумо координатҳои тамосро дар нисбати тиреза (UIWindow) ё намуд доред.
    • Барои муайян кардани он, ки оё тамос ба қабати муайян расидааст, лозим аст, ки ин координатҳоро ба системаи координатҳои он қабат табдил диҳед.
    • Барои ин, методҳои convert(_:from:) ё convert(_:to:)CALayer-ро истифода мебаред.
    • Пас аз табдил, шумо метавонед муайян кунед, ки нуқта дар дохили ҳудуди қабат (bounds) қарор дорад ё барои ин, истифодаи санҷишҳои махсус, масалан, contains(_:).
  3. Илова кардани UITapGestureRecognizer ба намуд:

    • Шумо метавонед UITapGestureRecognizer-ро ба UIView-и, ки бо қабат алоқаманд аст, илова кунед.
    • Дар ҳангоми коркарди гест, ҷойгиршавии тамосро дар нисбати намуд гиред.
    • Баъдан, бо истифода аз усули табдил додани координатҳо (қадами 2), санҷед, ки нуқта дар дохили қабати лозим ё зернамоҳои он қарор дорад.
  4. Эҷоди UIView барои ҳар қабати интерактивӣ:

    • Агар шумо қабатҳое дошта бошед, ки бояд интерактивӣ бошанд, роҳи соддатар ин аст, ки барои ҳар қабат, ки чунин аст, UIView мувофиқ созед.
    • Андозаи UIView-ро мувофиқи қабат танзим кунед.
    • Ҳамроҳ бо UITapGestureRecognizer-ҳо ё бо навиштани методҳои коркарди ҳодисаҳои тамос (touchesBegan, touchesEnded ва ғайра) дар ин намуд.
    • Ин роҳи беҳамто барои коркарди воридоти корбар дар UIKit аст, зеро UIView махсус барои ин тарҳрезӣ шудааст.

Масалан истифодаи hitTest дар UIView:

// Дар `UIView`-и махсус
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    // Табдил додани нуқтаи тамос ба координатҳои зернамо
    let pointInLayer = mySublayer.convert(point, from: layer!)
    
    // Санҷиш, ки нуқта дар дохили ҳудуди зернамо
    if mySublayer.contains(pointInLayer) {
        // Агар нуқта дар зернамо бошад, метавонем худ ё дигар намудро баргардонем,
        // ё иҷрои амалҳои заруриро анҷом диҳем.
        print("Пас аз mySublayer")
        // Мумкин аст nil баргардонем, агар нахоҳем, ки ин намуд минбаъд коркард кунад,
        // ё super.hitTest-ро, агар хоҳем, ки рафтори стандартиро нигоҳ дорем.
    }
    
    // Иҷозат медиҳем, ки `hitTest` стандартӣ барои дигар ҳолатҳо кор кунад
    return super.hitTest(point, with: event)
}

Масалан истифодаи табдил додани координатҳо дар ҳангоми коркарди гест:

// Дар `UIView`-и махсус бо `UITapGestureRecognizer` пайваст
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    let tapLocationInView = sender.location(in: self)
    // Табдил додани нуқтаи тамос аз координатҳои намуд ба координатҳои зернамо
    let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
    // Санҷиш, ки нуқта дар дохили ҳудуди зернамо
    if mySublayer.contains(tapLocationInSublayer) {
        print("Пас аз mySublayer")
        // Иҷрои амалҳое, ки бо пахш ба зернамо алоқаманданд
    }
}