Middle
Tətbiqdə istifadəçinin qatlama (layer) üzərinə klik etdiyini necə müəyyən etmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
CALayer-ə basmaq üçün bir neçə yanaşma istifadə edilə bilər:
-
View-də
hitTest(_:event:)istifadə etmək:UIView-dəhitTest(_:with:)metodu var, hansı ki, rekursiv olaraq alt view-lərin iyerarxiyasını keçir və verilmiş nöqtəni ehtiva edən ən dərin alt view-i qaytarır.- Bu metod default olaraq view-lərlə əlaqəli qatları nəzərə alır.
- Xüsusi nəzarət və ya alt qatlarda birbaşa basma hadisələrini işləmək üçün
hitTest(_:with:)metodunu özelleştirmək olar.
-
Koordinatların
convertilə çevrilməsi:- Təsirə məruz qalan hadisə (məsələn,
UIViewmetodlarında) sizdə toxunma koordinatları pəncərə (UIWindow) və ya view-ə görə verilir. - Bu koordinatların müəyyən qatın koordinat sisteminə çevrilməsi lazımdır.
- Bunun üçün
convert(_:from:)və yaconvert(_:to:)metodlarından istifadə olunur. - Çevirmədən sonra, nöqtənin qatın sərhədləri daxilində olub-olmadığını yoxlamaq və ya
contains(_:)kimi daha spesifik yoxlamalar etmək olar.
- Təsirə məruz qalan hadisə (məsələn,
-
UITapGestureRecognizer-i view-ə əlavə etmək:UIView-əUITapGestureRecognizerəlavə edə bilərsiniz.- Gest handler-də, toxunma yerini view-ə görə əldə edin.
- Daha sonra, koordinatların çevrilməsi metodunu (nömrə 2) istifadə edərək, nöqtənin qat və ya onun alt qatlarında olub-olmadığını yoxlayın.
-
Hər interaktiv qat üçün
UIViewyaratmaq:- Əgər qatlar interaktiv olmalıdırsa, ən sadə yol hər bir belə qat üçün uyğun
UIViewyaratmaqdır. UIView-in ölçüsünü və yerləşməsini qatla uyğunlaşdırın.- Toxunma hadisələrini işləyən handler-lər (
UITapGestureRecognizer) əlavə edin və yatouchesBegan,touchesEndedkimi metodları override edin. - Bu, UIKit-də istifadəçi girişini ən idiomatik şəkildə işləmək üçün ən yaxşı yoldur, çünki
UIViewbunun üçün xüsusi hazırlanıb.
- Əgər qatlar interaktiv olmalıdırsa, ən sadə yol hər bir belə qat üçün uyğun
hitTest-in UIView-də istifadəsinə nümunə:
// Özəl `UIView`-də
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
// Nöqtəni alt qatın koordinatlarına çeviririk
let pointInLayer = mySublayer.convert(point, from: layer!)
// Nöqtənin alt qatın sərhədləri daxilində olub-olmadığını yoxlayırıq
if mySublayer.contains(pointInLayer) {
// Əgər nöqtə alt qatın içindədirsə, özünü və ya başqa view-i qaytara bilərik,
// və ya lazım olan əməliyyatları yerinə yetirə bilərik.
print("mySublayer-ə basıldı")
// Əgər bu view-un daha çox işləməsini istəmirsinizsə, nil qaytara bilərsiniz,
// və ya standart davranış üçün super.hitTest-ə müraciət edə bilərsiniz.
}
// Standart `hitTest`-in digər halları işləməsinə imkan veririk
return super.hitTest(point, with: event)
}
UITapGestureRecognizer-in handler-də koordinatların çevrilməsinə nümunə:
// `UITapGestureRecognizer`-ə bağlı olan özəl `UIView`-də
@objc func handleTap(_ sender: UITapGestureRecognizer) {
let tapLocationInView = sender.location(in: self)
// Koordinatları view-dən alt qatın koordinatlarına çeviririk
let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
// Nöqtənin alt qatın sərhədləri daxilində olub-olmadığını yoxlayırıq
if mySublayer.contains(tapLocationInSublayer) {
print("mySublayer-ə basıldı")
// Alt qatın basılması ilə əlaqəli əməliyyatları yerinə yetirin
}
}