Sobes.tech
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:

  1. hitTest(_:event:) kasutamine vaates (View):

    • UIView omab meetodit hitTest(_: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:
  2. Koordinaatide teisendamine convert abil:

    • Kui saate torke sündmuse (näiteks UIView meetodites), 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õi convert(_:to:) meetodeid CALayer-il:
    • Pärast teisendamist saate kontrollida, kas saadud punkt asub kihtide piirides (bounds) või kasutada spetsiifilisemaid kontrollimisi, näiteks contains(_:):
  3. UITapGestureRecognizer-i ühendamine vaatega:

    • Võite ühendada UITapGestureRecognizer torke žestiga selle UIView-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:
  4. 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 UIView suurus vastavalt kihile:
    • Lisada žestide töötlejad (UITapGestureRecognizer) või üle kirjutada torke sündmuste töötlemise meetodid (touchesBegan, touchesEnded jne) selles vaates:
    • See on kõige idiomaatilisem viis kasutajasisendi töötlemiseks UIKitis, kuna UIView on selleks spetsiaalselt mõeldud.

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
    }
}