2015-09-11 11 views
8

Come posso ricevere tocchi utilizzando tvOS con il simulatore? Abbiamo bisogno di conoscere la posizione tattile. UIPress: non farlo!Come posso ricevere i tocchi usando tvOS?

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event { 
    // Never called 
} 

-(void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event { 
    // Works fine! 
} 

risposta

1

Penso che dovrebbe essere premuto Began invece di toccare Began.

(void)pressesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event 
+0

destro! presse Began, Cansel, Ended - Tutti funzionano bene. Abbiamo bisogno di un tipo di tocco - con posizione di X e Y sul pannello tattile! – user2545883

+0

@ user2545883 prega di prenotare questo come la risposta corretta se ha risolto il problema in modo che altri con lo stesso problema sapranno questa è la soluzione – Chris

0

Tenere presente che tvOS non ha la nozione di "toccare" come nel toccare lo schermo.

Il modo ufficiale per gestire "rubinetti" sta usando UITapGestureRecognizer. E ciò avverrebbe quando l'utente tocca/fa clic sul telecomando quando un elemento si trova in uno stato attivo.

Ecco come lo faccio lavorare con un UICollectionView:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    if let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MovieCell", forIndexPath: indexPath) as? MovieCell { 

     let movie = movies[indexPath.row] 
     cell.configureCell(movie) 

     if cell.gestureRecognizers?.count == nil { 
      let tap = UITapGestureRecognizer(target: self, action: "tapped:") 
      tap.allowedPressTypes = [NSNumber(integer: UIPressType.Select.rawValue)] 
      cell.addGestureRecognizer(tap) 
     } 

     return cell 

    } else { 
     return MovieCell() 
    } 
} 

func tapped(gesture: UITapGestureRecognizer) { 

    if let cell = gesture.view as? MovieCell { 
     //Load the next view controller and pass in the movie 
     print("Tap detected...") 
    } 
} 

È possibile afferrare la posizione del rubinetto dal UITapGestureRecognizer che viene passata in sulla funzione del gestore.

vedere anche questo tutorial su Apple TV: https://www.youtube.com/watch?v=XmLdEcq-QNI

+0

Non dovrebbe essere necessario un sistema di riconoscimento tap gesto in questo caso. Il normale UICollectionView didSelect ... i metodi delegati dovrebbero funzionare proprio come su iOS. – lemnar

+0

lemnar - non lo fanno. Ho passato parecchie ore a cercare di farlo funzionare finché non ho letto i documenti. Lo stato attivo e quindi il tocco del controller non hanno contesto di indexPath, quindi è necessario utilizzare il gesto di tocco. – Spentak

+0

Come si differenziano i tap dai clic? – David

10

presse sono legati ai pulsanti fisici, come il pulsante Menu. Una pressione inizia quando si tiene premuto un pulsante del genere e termina quando si smette di tenere premuto il pulsante. Non c'è nessuna posizione relativa allo schermo associata a una macchina da stampa.

Tocchi in tvOS sono simili ai tocchi in iOS, ma c'è una differenza importante: sono tocchi "indiretti", cioè non esiste una relazione fisica tra la posizione del dito e una posizione sullo schermo.

Quando un tocco inizia, verrà consegnato alla vista focalizzata e il tocco verrà considerato avviato al centro di tale vista, indipendentemente dalla posizione assoluta del dito sulla superficie tattile. Man mano che il tocco si sposta, la relativa posizione relativa allo schermo verrà aggiornata di conseguenza.

Io non sono a conoscenza di qualsiasi API che permetterebbe di determinare la posizione assoluta di un dito sulla superficie tattile.

Nel tuo caso, rendendo il vostro risponditore la vista focalizzata dovrebbe indurlo a ricevere eventi di tocco.

+0

https://developer.apple.com/library/prerelease/tvos/documentation/General/Conceptual/AppleTV_PG/DetectingButtonPressesandGestures.html#//apple_ref/doc/uid/TP40015241-CH16-SW1 – Mark

+0

In realtà è possibile ottenere valori assoluti da impostazione dei report di GCMicroGamepadAbsoluteDpadValues ​​su YES.Si prega di consultare questo: https://developer.apple.com/library/tvos/documentation/GameController/Reference/GCMicroGamepad_Ref/index.html#//apple_ref/occ/instp/GCMicroGamepad/reportsAbsoluteDpadValues ​​ –

+0

Questo è per il controller di gioco, non per il telecomando come capisco. –

0

Un modo semplice per farlo:

var tapGestureRecognizer: UITapGestureRecognizer! 

override func didMoveToView(view: SKView) { 

    tapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: Selector("tapped:")) 
    self.view?.addGestureRecognizer(tapGestureRecognizer) 

} 

func tapped(sender: UITapGestureRecognizer) { 

    // do something 

} 

Date un'occhiata al mio repository: https://github.com/fredericdnddev/tvOS-UITapGestureRecognizer/blob/master/tvOS%20Game/GameScene.swift

+0

La domanda è contrassegnata come obiettivo c, ed è ciò che utente2545883 sta cercando. Pubblicare una soluzione rapida non è utile per lui, né per altri come me che cercano esempi oggettivi. – seaders

+1

il problema con questa soluzione è che questo è PRESS non TAP. La domanda era di ottenere le coordinate del TAP! La stampa non ha le coordinate. Uno dei modi per ottenere le coordinate dai tocchi in TVOS è utilizzare UIPanGestureRecognizer. –

Problemi correlati