Middle
Kuidas määrata, kas kasutaja on rakenduses kihile (layer) vajutanud?
sobes.tech AI
Vastus AI-lt
Otsustamaks vajutuse CALayeri peal, saate kasutada mitmeid lähenemisviise:
-
hitTest(_:event:)kasutamine vaates (View):UIViewomab meetodithitTest(_:with:), mis rekursiivselt läbib alamvaadete hierarhia ja tagastab kõige sügavaima alamvaate, mis sisaldab määratud punkti:- See meetod arvestab vaikimisi vaadete seotud kihtidega:
- Saate üle kirjutada
hitTest(_:with:)oma kohandatud vaates, et saada detailsem kontroll või otse töödelda vajutusi alamkihtidel, mis ei ole seotud vaadete kanssa:
-
Koordinaatide teisendamine
convertabil:- Kui saate torke sündmuse (näiteks
UIViewmeetodites), on teil koordinaadid, mis on seotud akna (UIWindow) või vaatega: - Selleks, et määrata, kas torke tabas konkreetset kihti, tuleb need koordinaadid teisendada selle kihi koordinaatsüsteemi:
- Selleks kasutatakse
convert(_:from:)võiconvert(_:to:)meetodeidCALayer-il: - Pärast teisendamist saate kontrollida, kas saadud punkt asub kihtide piirides (
bounds) või kasutada spetsiifilisemaid kontrollimisi, näitekscontains(_:):
- Kui saate torke sündmuse (näiteks
-
UITapGestureRecognizer-i ühendamine vaatega:- Võite ühendada
UITapGestureRecognizertorke žestiga selleUIView-ga, mis on seotud kihiga: - Töötlemise ajal saate torke asukoha vaates:
- Seejärel kasutage koordinaatide teisendamise meetodit (osa 2), et kontrollida, kas punkt asub vajaliku kihi või selle alamkihtide sees:
- Võite ühendada
-
Loo iga interaktiivse kihi jaoks
UIView:- Kui teil on kihid, mis peavad olema interaktiivsed, kõige lihtsam viis on luua iga sellise kihi jaoks vastav
UIView: - Paigutada ja määrata
UIViewsuurus vastavalt kihile: - Lisada žestide töötlejad (
UITapGestureRecognizer) või üle kirjutada torke sündmuste töötlemise meetodid (touchesBegan,touchesEndedjne) selles vaates: - See on kõige idiomaatilisem viis kasutajasisendi töötlemiseks UIKitis, kuna
UIViewon selleks spetsiaalselt mõeldud.
- Kui teil on kihid, mis peavad olema interaktiivsed, kõige lihtsam viis on luua iga sellise kihi jaoks vastav
Näide hitTest kasutamisest UIView-is:
// Kohandatud `UIView`-is
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
// Muutke torkepunkt alamkihtide koordinaatideks
let pointInLayer = mySublayer.convert(point, from: layer!)
// Kontrollige, kas punkt asub alamkihtide piirides
if mySublayer.contains(pointInLayer) {
// Kui punkt on alamkihtide sees, saate tagastada ise või teise vaate,
// või teha vajalikke toiminguid:
print("Torkas mySublayeri peal")
// Võite tagastada nil, kui te ei soovi, et see vaade seda edasi töötleks,
// või `super.hitTest(point, with: event)` kui soovite säilitada standardkäitumise
}
// Luba standard `hitTest`-il töödelda ülejäänud juhtumeid
return super.hitTest(point, with: event)
}
Näide koordinaatide teisendamisest žestitöötluses:
// Põhineb `UIView`-il koos ühendatud `UITapGestureRecognizer`
@objc func handleTap(_ sender: UITapGestureRecognizer) {
let tapLocationInView = sender.location(in: self)
// Muutke torke asukoht vaate koordinaatidest alamkihtide koordinaatideks
let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
// Kontrollige, kas punkt asub alamkihtide piirides
if mySublayer.contains(tapLocationInSublayer) {
print("Torkas mySublayeri peal")
// Tehke tegevusi, mis on seotud torkega alamkihtidel
}
}