Middle
როგორ შეიძლება დადგინდეს, რომ მომხმარებელმა დაწკაპუნა ფენაზე (layer)?
sobes.tech AI
პასუხი AI-სგან
შესაძლებელია გამოიყენოთ hit testing: განსაზღვროთ, რომელ სართულზე მოხვდა შეხება. Core Animation სთავაზობს ორ მეთოდს ამისთვის:
-
hitTest(_:):- ამოწმებს, არის თუ არა წერტილი სართულს ან მის ნებისმიერ ქვესართულს შიგნით.
- აბრუნებს ყველაზე ღრმა ქვესართულს (ან სართულს), რომელიც შეიცავს წერტილს.
- ითვალისწინებს
isHidden = true.
-
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 {
// შეხება ქვესართულზე within myLayer
print("მოჭერით ქვესართულზე within 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-ის შემოწმება.