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 тийүү жести түзмөгүн CALayer менен байланышкан UIView-ге байлоо:
    • Жест иштетүүчүдө тийүү жайгашкан жерди көрүнүшкө карата алыңыз:
    • Андан соң, координаттарды которуу ыкмасын (бөлүм 2) колдонуп, тийүү чекити керек катмарда же анын субкатмарларында жайгашканын текшерүү:
  4. Ар бир интерактивдүү катмар үчүн UIView түзүү:

    • Эгерде сизде интерактивдүү болушу керек катмарлар болсо, эң жөнөкөй ыкма — ар бир катмар үчүн тиешелүү UIView түзүү:
    • Катмарга ылайык өлчөмдөрдү коюу жана орнотуу:
    • Жест иштетүүчү же 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(point, with: event)` кайтаруу, стандарттуу жүрүм-турумду сактоо үчүн
    }
    
    // Калган учурларды стандарттык `hitTest` иштетет
    return super.hitTest(point, with: event)
}

convert колдонуу мисалы жести иштетүүчүдө:

// `UITapGestureRecognizer` байланган `UIView` ичинде
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    let tapLocationInView = sender.location(in: self)
    
    // Тийүү чекитин көрүнүштөн субкатмарга которуу
    let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
    
    // Чекиттин субкатмардын чегинде экенин текшерүү
    if mySublayer.contains(tapLocationInSublayer) {
        print("mySublayer үстүндө басуу")
        // Бул жерде субкатмарга басуу менен байланышкан аракеттерди аткарыңыз
    }
}