【问题标题】:How can I receive touches using tvOS?如何使用 tvOS 接收触摸?
【发布时间】:2015-09-11 06:02:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c tvos


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你说得对!按 Began、Cansel、Ended - 一切正常。我们需要一个 Touch 类型 - 在触摸面板上按 X 和 Y 定位!
    • @user2545883 如果它解决了您的问题,请将其标记为正确答案,以便其他有相同问题的人知道这是解决方案
    【解决方案3】:

    请记住,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

    【讨论】:

    • 在这种情况下,您不需要点击手势识别器。普通的 UICollectionView didSelect... 委托方法应该像在 iOS 上一样工作。
    • lemnar - 他们没有。花了好几个小时试图让它工作,直到我阅读文档。焦点状态然后控制器点击没有 indexPath 的上下文,因此您必须使用点击手势。
    • 如何区分点击和点击?
    【解决方案4】:

    一个简单的方法:

    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

    【讨论】:

    • 问题被标记为目标 c,这就是 user2545883 正在寻找的内容。发布快速解决方案对他没有帮助,也对像我这样寻找客观 c 示例的其他人没有帮助。
    • 这个解决方案的问题在于这是 PRESS 而不是 TAP。问题是要获得 TAP 的坐标! Press没有坐标。在 TVOS 中获取触摸坐标的方法之一是使用 UIPanGestureRecognizer。
    猜你喜欢
    • 2015-06-28
    • 2023-04-01
    • 2012-02-17
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多