2015-09-11 8 views
8

は、どのように私は、シミュレータでtvOSを使用してタッチを受け取ることができますか?私たちは知っているタッチの位置が必要です。 UIPress - それを持っていない!はどうすればtvOSを使用してタッチを受け取ることができますか?

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

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

答えて

1

は、私はそれがpressesBeganの代わりtouchedBeganされるべきだと思います。

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

あなたが正しいです!プレス開始、Cansel、終了 - すべて正常に動作します。タッチパネルにXとYの位置でタッチタイプが必要です! – user2545883

+0

@ user2545883この問題を解決した場合は正しい答えとしてマークしてください。同じ問題を抱える他の人がこれが解決策であることがわかるようにしてください – Chris

0

tvOSには、画面に触れるように「触れる」という概念はありません。

UITapGestureRecognizerを使用している「タップ」扱いする公式の方法。それは、アイテムがフォーカス状態にあるときにユーザがリモートをタップ/クリックするときです。

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...") 
    } 
} 

あなたは、ハンドラ関数に渡されますUITapGestureRecognizerからタップの位置をつかむことができます。ここでは

は、私がUICollectionViewでの作業にそれをやっている方法です。 https://www.youtube.com/watch?v=XmLdEcq-QNI

+0

この場合、タップジェスチャ認識機能は必要ありません。通常のUICollectionView didSelect ...デリゲートメソッドは、iOSと同じように動作するはずです。 – lemnar

+0

lemnar - そうではありません。私がドキュメントを読むまで、それを稼働させようとかなりの時間を費やしました。フォーカス状態とコントローラタップにはindexPathのコンテキストがないため、タップジェスチャを使用する必要があります。 – Spentak

+0

はどのようにクリックからタップを区別するのですか? – David

10

プレスは、メニューボタンのように、物理的なボタンに関連しています

はまた、Apple TVで、このチュートリアルを参照してください。そのようなボタンを押し続けると、プレスが始まり、押さえを止めるとプレスが終了します。プレスに関連する画面相対位置はありません。

tvOSのタッチはiOSのタッチと似ていますが、重要な違いが1つあります。「間接」タッチです。つまり、指の位置と画面上の位置の間に物理的な関係はありません。

タッチが開始されると、タッチ面上の指の絶対位置にかかわらず、タッチがフォーカスされたビューに配信され、タッチがそのビューの中央で開始されたとみなされます。タッチが動くと、その画面相対位置がそれに応じて更新されます。

私は、あなたがタッチ面上の指の絶対的な位置を決定することを可能にするAPIは認識していません。

レスポンダにフォーカスを当てると、タッチイベントが発生するはずです。

+0

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

+0

実際には、 GCMicroGamepadのreportsAbsoluteDpadValuesをYESに設定します。これを参照してください:https://developer.apple.com/library/tvos/documentation/GameController/Reference/GCMicroGamepad_Ref/index.html#//apple_ref/occ/instp/GCMicroGamepad/reportsAbsoluteDpadValues –

+0

これはゲームコントローラ用で、私が理解するようにリモートのために。 –

0

それを行うための簡単な方法:

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 

} 

は私のリポジトリに見てみましょう:https://github.com/fredericdnddev/tvOS-UITapGestureRecognizer/blob/master/tvOS%20Game/GameScene.swift

+0

質問は客観的なcとマークされており、それがuser2545883が探しているものです。迅速なソリューションを投稿することは彼にとっては役に立たないし、他の人たちも私が客観的な例を探しているようなものではない。 – seaders

+1

このソリューションの問題は、これがTAPではないことです。問題はTAPの座標を取得することでした!プレスには座標がありません。 TVOSで座標を取得する方法の1つは、UIPanGestureRecognizerを使用することです。 –

関連する問題