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(point, with: event)`՝ պահպանելու ստանդարտ վարքագիծը
    }
    
    // Թույլատրում ենք ստանդարտ `hitTest`-ին մշակել մնացած դեպքերը
    return super.hitTest(point, with: event)
}

Օրինակ convert-ի օգտագործումը ժեստի մշակողում:

// Անհատական 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-ի վրա")
        // Կատարեք գործողություններ, որոնք կապված են ենթաշերտի սեղմման հետ
    }
}