Middle
Ilovada foydalanuvchi qatlamga (layer) bosganligini qanday aniqlash mumkin?
sobes.tech AI
AIdan javob
CALayer üzerindeki dokunuşları tespit etmek üçün bir neçə yanaşma mövcuddur:
-
hitTest(_:event:)istifadə edərək View-də:UIView-inhitTest(_:with:)metodu, rekursiv olaraq alt görünüşlərin hierarxiyasını yoxlayır və verilmiş nöqtəni ən dərin olan görünüşü geri qaytarır.- Bu metod default olaraq görünüşlərlə əlaqəli qatmanları nəzərə alır.
- Özəl görünüşdə
hitTest(_:with:)metodunu üstələyərək daha detallı nəzarət edə və ya birbaşa alt qatlarda basmağa cavab verə bilərsiniz.
-
Koordinatların
convertilə çevrilməsi:- Toxunma hadisəsi (məsələn,
UIViewmetodlarında) alındıqda, toxunmanın koordinatları pəncərə (UIWindow) və ya görünmə görə alınır. - Bu koordinatların müəyyən bir qatda olub-olmadığını təyin etmək üçün, onları həmin qatın koordinat sisteminə çevirmək lazımdır.
- Bunun üçün
convert(_:from:)və yaconvert(_:to:)metodlarından istifadə edilir. - Çevirildikdən sonra, nöqtənin qatın sərhədləri daxilində olub-olmadığını yoxlaya və ya
contains(_:)kimi daha spesifik yoxlamalar edə bilərsiniz.
- Toxunma hadisəsi (məsələn,
-
UITapGestureRecognizer-i görünməyə əlavə etmək:UIView-əUITapGestureRecognizerəlavə edə bilərsiniz, hansı ki, qatla əlaqəlidir.- Geste handler-də, toxunma yerini görünməyə görə əldə edin.
- Sonra, koordinat çevirmə metodundan (maddə 2) istifadə edərək, toxunma nöqtəsinin müvafiq 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 biri üçün
UIViewyaratmaqdır. - Onu yerləşdirin və ölçüsünü qatla uyğunlaşdırın.
- Geste idarəediciləri (
UITapGestureRecognizer) əlavə edin və yatouchesBegan,touchesEndedkimi metodları üstələyin. - Bu, UIKit-də istifadəçi girişlərini idarə etməyin ən idiomatik yoludur, çünki
UIViewbunun üçün xüsusi hazırlanıb.
- Əgər qatlar interaktiv olmalıdırsa, ən sadə yol hər biri üçün
hitTest istifadə nümunəsi:
// Özəl `UIView`-də
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
// Toxunma nöqtəsini alt qatın koordinatlarına çevirin
let pointInLayer = mySublayer.convert(point, from: layer!)
// Nöqtənin alt qatın sərhədləri daxilində olub-olmadığını yoxlayın
if mySublayer.contains(pointInLayer) {
// Əgər nöqtə alt qatda isə, onu və ya başqa bir görünüşü qaytara bilərsiniz
// və ya lazım olan əməliyyatları yerinə yetirin.
// Bu halda, toxunmanın "alt qat" üzərində olduğunu müəyyən edirik.
print("mySublayer üzərində toxunma")
// `nil` qaytarmaq olar, əgər bu görünüşün daha çox işləməsini istəmirsinizsə, və ya super.hitTest istifadə edin.
}
// Standart `hitTest`-in digər halları idarə etməsinə icazə verin
return super.hitTest(point, with: event)
}
Geste idarəedicisində koordinatların çevrilməsinə nümunə:
// `UITapGestureRecognizer`-ə bağlı `UIView`-də
@objc func handleTap(_ sender: UITapGestureRecognizer) {
let tapLocationInView = sender.location(in: self)
// Toxunma nöqtəsini alt qatın koordinatlarına çevirin
let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
// Nöqtənin alt qatın sərhədləri daxilində olub-olmadığını yoxlayın
if mySublayer.contains(tapLocationInSublayer) {
print("mySublayer üzərində toxunma")
// Alt qat üzərində toxunma ilə əlaqəli əməliyyatları yerinə yetirin
}
}