2015-09-11 9 views
8

Jak mogę otrzymywać dotknięcia za pomocą TVOS z symulatorem? Potrzebujemy znać pozycję dotykową. UIPress - nie ma go!Jak mogę odbierać dotknięcia za pomocą TVOS?

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

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

Odpowiedz

1

Myślę, że powinny to być prasyBan zamiast dotknąćBegan.

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

cię! prasy Began, Cansel, Ended - Wszystko działa dobrze. Potrzebujemy typu Touch - z pozycją X i Y na panelu dotykowym! – user2545883

+0

@ user2545883 należy oznaczyć jako poprawną odpowiedź, jeśli rozwiązuje problem, aby inni o tym samym problemie wiedzieli, że jest to rozwiązanie. – Chris

0

Należy pamiętać, że tvOS nie ma pojęcia "dotykania" jak przy dotykaniu ekranu.

Oficjalnym sposobem obsługi "dotknięć" jest użycie UITapGestureRecognizer. I to będzie, gdy użytkownik dotknie/klika pilota, gdy element jest w stanie skupienia.

Oto jak ja to robię pracy z 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...") 
    } 
} 

Można chwycić pozycję kranu z UITapGestureRecognizer że zostanie przeniesiony w funkcję obsługi.

zobaczyć również samouczek na Apple TV: https://www.youtube.com/watch?v=XmLdEcq-QNI

+0

W tym przypadku nie powinno być potrzebne rozpoznawanie gestów. Normalne metody UICollectionView didSelect ... delegate powinny działać tak jak w iOS. – lemnar

+0

lemnar - oni nie. Spędziłem kilka godzin próbując zmusić to do pracy dopóki nie przeczytałem dokumentów. Stan skupienia, a następnie dotknij kontrolki nie ma kontekstu indeksu ścieżki, więc musisz użyć gestu dotykowego. – Spentak

+0

Jak odróżniasz kliknięcia od kliknięć? – David

10

Prasy są związane z fizycznych przycisków, takich jak przycisk menu. Naciśnięcie przycisku rozpoczyna się po naciśnięciu przycisku, który kończy się, gdy przestaniesz trzymać wciśnięty przycisk. Nie ma żadnej pozycji zależnej od ekranu związanej z prasą.

Dotyki w tvOS są podobne do dotknięć w iOS, ale jest jedna ważna różnica: są to "pośrednie" dotknięcia, tj. Nie ma fizycznej relacji między położeniem palca a położeniem na ekranie.

Po rozpoczęciu dotknięć zostanie dostarczony do widoku skupienia, a dotyk zostanie rozpoczęty w środku tego widoku, niezależnie od bezwzględnego położenia palca na powierzchni dotykowej. W miarę poruszania się, jego pozycja względna na ekranie zostanie odpowiednio zaktualizowana.

Nie znam żadnego interfejsu API, który pozwalałby określić bezwzględne położenie palca na powierzchni dotykowej.

W twoim przypadku sprawienie, by osoba reagująca była skupiona, powinna spowodować, że będzie otrzymywać zdarzenia dotykowe.

+0

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

+0

W rzeczywistości można uzyskać wartości bezwzględne według ustawianie raportów GCMicroGamepadAbsoluteDpadValues ​​na YES.Zobacz: https://developer.apple.com/library/tvos/documentation/GameController/Reference/GCMicroGamepad_Ref/index.html#//apple_ref/occ/instp/GCMicroGamepad/reportsAbsoluteDpadValues ​​ –

+0

To jest dla kontrolera gier, nie dla pilota, jak rozumiem. –

0

Łatwym sposobem, aby to zrobić:

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 

} 

Spójrz na moim repozytorium: https://github.com/fredericdnddev/tvOS-UITapGestureRecognizer/blob/master/tvOS%20Game/GameScene.swift

+0

Pytanie jest oznaczone jako cel c, i właśnie tego szuka użytkownik2545883. Zamieszczanie szybkich rozwiązań nie jest pomocne dla niego ani dla innych osób takich jak ja szukających obiektywnych przykładów c. – seaders

+1

Problem z tym rozwiązaniem polega na tym, że to PRESS nie TAP. Pytanie dotyczyło uzyskania współrzędnych TAP! Prasa nie ma współrzędnych. Jednym ze sposobów uzyskania współrzędnych z dotknięć w TVOS jest użycie UIPanGestureRecognizer. –