Swipe Gesture Recognizer. Intercettare i tocchi sullo schermo

ENTRA NEL NOSTRO GRUPPO FACEBOOK

×

Corso creare applicazioni per iOS con il linguaggio Swift

Nella precedente lezione hai creato uno Slider utilizzando tre diversi View Controller. Ti avevo anche detto, alla fine della lezione, che se i View Controller avessero avuto tutti lo stesso contenuto, cioè con la stessa grafica ed il contenuto che cambia, non sarebbe stato opportuno utilizzare quel sistema. Infatti, quando hai bisogno di creare uno [...]

Torna a: Corso creare applicazioni per iOS con il linguaggio Swift > TableView, TabBar e CollectionView
  • Marco Guerrera

    Non richiama la funzione che dovrebbe stampare “tap intercettato”, se assegno .addGestureRecognizer(tap_gestureRec) alla view principale che visualizza una WKWebView. Consigli?

    • Ciao Marco,

      Se la WKWebView copre la view del ViewController è quest’ultima a dover intercettare il tap. Quindi prova ad attaccare il recognizer su di questo.

      Fammi sapere ;)
      Giuseppe Sapienza

      • Marco Guerrera

        Purtoppo non c’è stato verso. Alla fine ho risolto usando un’altra strada per conseguire lo scopo a monte di questa domanda. Grazie cmq.

  • nickbonny

    Ciao Beppe, come mai in questa e altre due lezioni una volta completato il test mi dice che dovrà essere corretto?

    • Ciao Nick,
      Perché ci sono dei problemi con dei plugin che devo aggiornare. Spero di farlo questa notte così da non causare interruzioni del servizio e ripristinare tutto il sistema dei quiz.

  • korner

    Ciao,
    ho creato 2 funzioni, una scala la view con il tapgesture e una fa il pan. Se prima faccio il pan, poi quella che scala, pur facendo correttamente l’operazione, torna al centro. In pratica non riesco a scalare la view dopo che l’ho spostata in una nuova posizione….

    • Ciao Korner,
      Scusa il ritardo ma sono stato impegnato con un esame. Si, purtroppo questo è uno dei problemi delle funzioni di trasformazione. Infatti queste applicano la “trasformazione” all’oggetto ma non modificano lo stato iniziale dell’oggetto. Questo vuol dire che se vuoi concatenare due trasformazioni che non vengono eseguite nella stessa istanza (dove puoi utilizzare la CGAffineTransformConcat) devi memorizzare in delle variabili il risultato della trasformazione per poi applicarle all’oggetto una volta finita l’animazione o la gesture.
      Cioè, se sposti l’oggetto, conserva i valori finali della posizione X,Y e poi assegnali all’oggetto.

      Le funzioni di trasformazioni sono ottime quando si deve eseguire solo un particolare evento, ma diventano scomode quando se ne devono concatenare di più in diversi momenti.

      • korner

        Grazie Peppe,
        sono contento perchè ho indovinato dove sta il problema, però non capisco dove sbaglio nel riapplicare le informazioni salvate. Provo ancora e poi ti faccio sapere.
        Non scusarti per il ritardo, soprattutto se è per lo studio.

        • Fammi sapere, in caso lo risolviamo insieme!

          • korner

            in parte ci sono riuscito. Prima scalo la view, ingrandendola, e poi faccio il pan. Al primo pan tutto ok, quando invece lo rifaccio, la view, si sposta istantaneamente in un punto di partenza che non è il suo. Non capisco quale dato stia usando. Penso di aver capito il concetto, devo ricalcolare e riassegnare le dimensioni del frame e la posizione…continuo a provare

      • fabiod

        Ciao Giuseppe, anch’io ho un problema del genere. In pratica vorrei che una volta raggiunto un punto spostando un oggetto con il panGesture, poi al successivo pan, l’oggetto parta dalla posizione raggiunta in precedenza. Ho usato due variabili per conservare l’ultima posizione raggiunta, che poi riassegno alla view in questione nella func che gestisce il pan in corrispondenza del case . Began. Non funziona, ho fatto numerose modifiche ma niente. Torna sempre al punto iniziale appena un nuovo pan arriva al case . Changed . Che posso fare?
        (ho anche provato a creare l’oggetto myView da codice nel viewDidLoad e non da Storyboard, ma non c’è verso). Questo è il codice con la funzione che gestisce il pan:

        var x = CGFloat()
        var y = CGFloat()

        func handPan(sender: UIPanGestureRecognizer) {

        switch sender.state {

        case .Began:
        self.myView.frame.origin.x = self.x
        self.myView.frame.origin.y = self.y
        print(“Began. x: (self.x) y: (self.y)”)

        case .Changed:
        let translationPoint = sender.translationInView(sender.view)
        sender.view!.transform = CGAffineTransformMakeTranslation(translationPoint.x, translationPoint.y)
        self.x = self.myView.frame.origin.x
        self.y = self.myView.frame.origin.y

        default:
        break
        }
        }

  • Francesco

    Ciao Peppe,

    ma se vorrei fare la stessa cosa su una immagine? ovvero al tap su imageview invece che su una view.

    ho provato ma non ci riesco ma vorrei capire se sono io e non si può fare?

    • Ciao Francesco,

      Una UIImageView è una subclass della UIView. Ergo nessuno ti vieta di attaccare il recognizer sull’immagine.

      self.tuaUIImageView.addGestureRecognizer(tap_gestureRec)

      Se dovessero esserci altri problemi, dimmi pure ;)

  • Lollo82

    Ciao Peppe!!! Ho capito più o meno tutto. Ho aggiunto un oggetto TapGestureRecognizer all’esercizio famoso del calcolo dell’IMC e vorrei che ad un tap sul display corrispondesse a chiusura della tastiera. Ma non so proprio come richiamare il resignFirstResponder quando intercetto il tap. Credo che il problema sia che il resignFirstResponder è un metodo UITextField, quindi per poterlo chiamare devo farlo all’interno di un oggetto UITextField, non posso richiamarlo ovunque. Ma come faccio a unire le cose??? Cioè quando ho la textField aperta a intercettare l’evento e richiamare il resignFirstResponder??? Non so se mi son spiegato. Grazie mille peppe!!!

    • Ciao Lollo,
      Puoi richiamarlo da qualsiasi punto creando delle IBOutlet della TextField e facendo un semplice

      self.tuaTextField.resignFirstResponder()

      Se non è questo, fammi un esempio perché non mi è ben chiaro il caso d’applicazione!
      Giuseppe Sapienza | xCoding.it

Start typing and press Enter to search