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που σχετίζεται με το στρώμα. - Στον χειριστή του gesture, λαμβάνετε τη θέση της αφής σε σχέση με το προβολή.
- Στη συνέχεια, χρησιμοποιώντας την προσέγγιση μετατροπής συντεταγμένων (βήμα 2), ελέγχετε αν το σημείο της αφής βρίσκεται μέσα στο επιθυμητό στρώμα ή στα υποστρώματά του.
- Μπορείτε να προσθέσετε ένα
-
Δημιουργία
UIViewγια κάθε διαδραστικό στρώμα:- Αν έχετε στρώματα που πρέπει να είναι διαδραστικά, ο πιο απλός τρόπος είναι να δημιουργήσετε ένα
UIViewγια κάθε τέτοιο στρώμα. - Τοποθετήστε και ρυθμίστε το μέγεθος του
UIViewσύμφωνα με το στρώμα. - Προσθέστε χειριστές gesture (
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)
}
Παράδειγμα χρήσης μετατροπής συντεταγμένων στον χειριστή gesture:
// Σε προσαρμοσμένο `UIView` με attached `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")
// Εκτέλεση ενεργειών που σχετίζονται με το πάτημα στο υποστρώμα
}
}