Middle
Foydalanuvchi qatlamaga (layer) bosganligini qanday aniqlash mumkin?
sobes.tech AI
AIdan javob
Hit testingdan foydalanish mumkin: qaysi qatlamda aniqroq teginish bo'lib o'tganligini aniqlash. Core Animation bu uchun ikki usulni taqdim etadi:
-
hitTest(_:):- Nuqta qatlam yoki uning har qanday pastki qatlamlar chegaralarida joylashganligini tekshiradi.
- Nuqtani o'z ichiga olgan eng chuqur pastki qatlamni (yoki qatlamni o'zi) qaytaradi.
isHidden = trueni hisobga oladi.
-
contains(_:):- Faqat nuqta qatlamning chegaralarida joylashganligini tekshiradi.
- Pastki qatlamlar hierarxiyasini hisobga olmaydi.
isHiddenni hisobga olmaydi.
Odatiy holda, hitTest ishlatiladi, chunki u interaktivlikni aniqlashda yanada aniqroq.
hitTest dan foydalanish misoli:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let locationInView = touch.location(in: view)
// Nuqtani view koordinatalaridan qatlam koordinatalariga o'tkazamiz
let locationInLayer = myLayer.convert(locationInView, from: view.layer)
// Hit test o'tkazamiz
if let hitLayer = myLayer.hitTest(locationInLayer) {
if hitLayer === myLayer {
// Aniq myLayer ga tegildi
print("myLayer ga tegildi")
} else {
// myLayer ichidagi pastki qatlamga tegildi
print("myLayer ichidagi pastki qatlamga tegildi")
// Pastki qatlamni aniqlash qo'shimcha tekshiruvlarni talab qilishi mumkin
}
} else {
// myLayer va uning pastki qatlamlari tashqarisida tegildi
print("myLayer tashqarisida tegildi")
}
}
Muhim nuqtalar:
- Teginish nuqtasining koordinatalari (
location(in:)) har doimUIViewbilan bog'liq. Ularni qatlam koordinatalariga aylantirish kerak (convert(_, from:)yokiconvert(_, to:)). hitTest(_:)metodi chaqiruvchining koordinatalar tizimida ishlaydi (myLayer.hitTest(locationInLayer)).- Agar qatlam ko'rinmas bo'lsa (
alpha = 0yokiisHidden = true),hitTestnilqaytaradi.containsesa, ko'rinishdan qat'iy nazar, nuqta chegaralar ichida bo'lsa,trueqaytaradi. - Murakkab qatlam hierarxiyalari uchun, rekursiv qidiruv yoki qaytarilgan
hitLayerni tekshirish talab qilinishi mumkin.