Sobes.tech
Middle

Kā noteikt, vai lietotājs ir nospiedis slāni (layer) lietotnē?

sobes.tech AI

Atbilde no AI

Nosakot pieskārienu uz CALayer, jūs varat izmantot vairākus pieejas veidus:

  1. Izmantot hitTest(_:event:) skatā (View):

    • UIView ir metode hitTest(_:with:), kas rekursīvi pārbauda apakšskatāru hierarhiju un atgriež visdziļāko apakšskatāru, kas ietver norādīto punktu:
    • Šī metode pēc noklusējuma ņem vērā ar skatījumu saistītos slāņus:
    • Jūs varat pārdefinēt hitTest(_:with:) savā pielāgotajā skatā, lai iegūtu detalizētāku kontroli vai tieši apstrādātu pieskārienus zemākajos slāņos, kas nav saistīti ar skatījumiem:
  2. Koordinātu pārveidošana ar convert:

    • Kad saņemat pieskāriena notikumu (piemēram, UIView metodēs), jums ir koordinātas, kas attiecas uz logu (UIWindow) vai skatu:
    • Lai noteiktu, vai pieskāriens ir kritis konkrētā slānī, ir jāveic šo koordinātu pārveidošana uz šī slāņa koordinātu sistēmu:
    • Tam tiek izmantotas convert(_:from:) vai convert(_:to:) metodes CALayer:
    • Pēc pārveidošanas var pārbaudīt, vai iegūtais punkts atrodas slāņa robežās (bounds) vai izmantot specifiskākas pārbaudes, piemēram, contains(_:):
  3. UITapGestureRecognizer pievienošana skata līmenī:

    • Var pievienot UITapGestureRecognizer pieskāriena žestam tam UIView, kas ir saistīts ar slāni:
    • Apstrādes laikā saņemiet pieskāriena atrašanās vietu attiecībā uz skatu:
    • Tad izmantojiet koordinātu pārveidošanas pieeju (daļa 2), lai pārbaudītu, vai punkts ir norādītā slāņa vai tā apakšslāņu iekšienē:
  4. Izveidot UIView katram interaktīvajam slānim:

    • Ja jums ir slāņi, kuriem jābūt interaktīviem, vienkāršākais veids ir izveidot katram atbilstošu UIView:
    • Novietot un iestatīt UIView izmēru atbilstoši slānim:
    • Pievienot žestu apstrādes funkcijas (UITapGestureRecognizer) vai pārdefinēt pieskāriena notikumu apstrādes metodes (touchesBegan, touchesEnded utt.) šajā skatā:
    • Tas ir vispiemērotākais veids, kā apstrādāt lietotāja ievadi UIKit vidē, jo UIView ir īpaši paredzēts tam.

Piemērs, izmantojot hitTest UIView iekšienē:

// Pielāgotā `UIView`
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    // Pārveidot pieskāriena punktu uz apakšslāņa koordinātām
    let pointInLayer = mySublayer.convert(point, from: layer!)
    
    // Pārbaudīt, vai punkts atrodas apakšslāņa robežās
    if mySublayer.contains(pointInLayer) {
        // Ja punkts ir apakšslānī, varat atgriezt sevi vai citu skatu,
        // vai veikt nepieciešamās darbības:
        print("Piespiests uz mySublayer")
        // Varat atgriezt nil, ja nevēlaties, lai šis skats turpina apstrādi,
        // vai `super.hitTest(point, with: event)` ja vēlaties saglabāt standarta uzvedību
    }
    
    // Atļaut standarta `hitTest` apstrādāt pārējos gadījumus
    return super.hitTest(point, with: event)
}

Piemērs, izmantojot koordinātu pārveidošanu žestā:

// Pielāgotā `UIView` ar pievienotu `UITapGestureRecognizer`
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    let tapLocationInView = sender.location(in: self)
    
    // Pārveidot pieskāriena punktu no skata koordinātām uz apakšslāņa koordinātām
    let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
    
    // Pārbaudīt, vai punkts ir apakšslāņa robežās
    if mySublayer.contains(tapLocationInSublayer) {
        print("Piespiests uz mySublayer")
        // Veikt darbības, kas saistītas ar pieskārienu uz apakšslāņa
    }
}