Middle
Ինչպե՞ս որոշել, որ օգտվողը սեղմել է շերտի (layer) վրա ծրագրում։
sobes.tech AI
Պատասխան AI-ից
Նախագծելու համար CALayer սեղմումը որոշելու համար կարող եք օգտագործել մի քանի մոտեցումներ:
-
Օգտագործել
hitTest(_:event:)տեսքի (View) մեջ:UIViewունիhitTest(_:with:)մեթոդը, որը ռեկուրսիվ անցնում է ենթատեսակների հիերարխիայով և վերադարձնում է ամենամեղմ ենթատեսակ, որը պարունակում է նշված կետը:- Այս մեթոդը ըստ նախնական կարգավորումների հաշվում է տեսքերին կապված շերտերը:
- Կարող եք վերագրել
hitTest(_:with:)ձեր անհատական տեսքին՝ ավելի մանրամասն վերահսկողություն կամ սեղմումների մշակման համար անմիջապես ենթաշերտերի վրա, որոնք չեն կապված տեսքերին:
-
Կոորդինատների փոխարկում
convert-ի միջոցով:- Երբ ստանում եք սեղմման իրադարձությունը (օրինակ,
UIViewմեթոդներում), ունեք կոորդինատները՝ կապված պատուհանի (UIWindow) կամ տեսքի հետ: - Որպեսզի որոշեք, արդյոք սեղմումը ընկել է որոշ շերտի վրա, անհրաժեշտ է փոխարկել այդ կոորդինատները այդ շերտի համակարգում:
- Օգտագործվում են
convert(_:from:)կամconvert(_:to:)մեթոդներըCALayer-ի: - Փոխարկումից հետո կարելի է ստուգել, արդյոք ստացված կետը գտնվում է շերտի սահմաններում (
bounds) կամ օգտագործել ավելի հատուկ ստուգումներ, օրինակ,contains(_:):
- Երբ ստանում եք սեղմման իրադարձությունը (օրինակ,
-
UITapGestureRecognizerկցել տեսքին:- Կարող եք կցել
UITapGestureRecognizerսեղմման ժեստը այնUIView-ին, որի հետ կապված է շերտը: - Ժեստի մշակողում ստացեք սեղմման տեղադրությունը տեսքի նկատմամբ:
- Հետո օգտագործեք կոորդինատների փոխարկման մոտեցումը (մաս 2), որպեսզի ստուգեք, արդյոք սեղմման կետը գտնվում է անհրաժեշտ շերտի կամ նրա ենթաշերտերի վրա:
- Կարող եք կցել
-
Ստեղծել
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-ի վրա")
// Կատարեք գործողություններ, որոնք կապված են ենթաշերտի սեղմման հետ
}
}