10

如何在模拟器上使用 tvOS 接收触摸?我们需要知道触摸位置。UIPress - 没有它!

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

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

4 回答 4

12

按下与物理按钮相关,例如菜单按钮。当您开始按住此类按钮时,按下开始,并在您停止按住按钮时结束。没有与印刷机相关的任何屏幕相对位置。

tvOS 中的触摸与 iOS 中的触摸类似,但有一个重要区别:它们是“间接”触摸,即手指的位置与屏幕上的位置之间没有物理关系。

当触摸开始时,它将被传递到焦点视图,并且无论手指在触摸表面上的绝对位置如何,都将认为触摸是从该视图的中心开始的。随着触摸移动,其屏幕相对位置将相应更新。

我不知道有任何 API 可以让您确定手指在触摸表面上的绝对位置。

在您的情况下,使您的响应者成为焦点视图应该使其接收触摸事件。

于 2015-09-13T07:51:52.203 回答
2

我认为应该是 pressesBegan 而不是touchedBegan。

(void)pressesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
于 2015-09-11T06:12:34.030 回答
0

请记住,tvOS 没有触摸屏幕的“触摸”概念。

处理“点击”的官方方法是使用 UITapGestureRecognizer。那就是当项目处于焦点状态时用户点击/单击遥控器时。

以下是我使用 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...")
    }
}

您可以从处理函数中传入的 UITapGestureRecognizer 中获取点击的位置。

另请参阅 Apple TV 上的本教程: https ://www.youtube.com/watch?v=XmLdEcq-QNI

于 2015-09-13T05:37:05.203 回答
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

于 2015-09-16T00:01:45.417 回答