本文由 CocoaChina 译者呆萌院长( 博客 )翻译自 苹果开发者中心
校对: hyhSuper( GitHub )
原文: App Programming Guide for tvOS:Building Apple TV Apps--Detecting Gestures and Button Presses
本文档文章包括
Apple TV 编程指南:介绍
Apple TV 编程指南:创建Client-Server App
Apple TV 编程指南:使用Apple TV遥控器控制屏幕上的用户界面
Apple TV 编程指南:检测手势和按钮按压
Apple TV 编程指南:设计键盘输入体验
Apple TV 编程指南:使用游戏控制器
Apple TV 编程指南:创造视差美术资源
Apple TV 编程指南:资源管理
当用户在遥控器上按下一个按钮或者在触摸板上做一个手势的时候,大多数情况下 UIKit 视图会给出正确的反应。例如,当一个 UIButton 对象获得焦点并且用按下这个按钮的时候,它就会发送一条消息。但是,你很想实现当用户点击一个按钮或者触发一个手势的时候的自定义行为,就像在 iOS 设备上的触摸事件一样方便简洁。与其他事件一样,按钮的点击事件也是通过相应链来处理的。
UIGestureRecognizer 和 UIResponder 类包括作为在遥控器上的按钮按压或抬起响应的新方法。除此之外,当手势在Siri远程触摸板上实施的时候,与手势相关的手势识别器,像拖拽手势识别器和滑动手势识别器,能够自动的工作。
使用手势识别器
点击手势识别器可以用来检测按钮点击事件。默认情况下,当选择的按钮被按下时,将会触发一个点击手势。allowedPressTypes属性用检查哪一个按钮触发了点击手势识别器。
Listing 4-1创建一个手势识别器,当按下播放/暂停按钮时会触发它。
Listing 4-1 检测Play/Pause按钮
let tapRecognizer = UITapGestureRecognizer(target: self, action: "tapped:") tapRecognizer.allowedPressTypes = [NSNumber(integer: UIPressType.PlayPause.rawValue)]; self.view.addGestureRecognizer(tapRecognizer)
同样的,滑动或拖拽手势识别器可以用来检测在远程触摸板上的手势运动。例子4-2显示了如何检测在触摸板上的向右滑动的手势。
Listing 4-2检测滑动手势
let swipeRecognizer = UISwipeGestureRecognizer(target: self, action: "swiped:") swipeRecognizer.direction = .Right self.view.addGestureRecognizer(swipeRecognizer)
处理低级别事件处理
UIPress 类对象类似于 UITouch 对象,但是它提供的是关于在遥控器或者其他设备(例如游戏控制器)上的按钮信息。一个 UIPress 对象会告诉你哪个按钮正在被使用,并且告诉你这个按钮的当前状态,例如它是否被按下,或者是否被释放,又或者仍然在被按着的状态。对于类似的按钮,UIPress 对象提供了关于对按钮施加多少压力的信息。 type 属性检查了物理按钮状态的改变,UIPress 对象的其他属性描述了这一改变行为。
UIGestureRecognizer 和 UIResponder 对象能够实现当按下事件被调用并且传递到响应链时所调用的那些方法。这些方法都接收到了一个 UIPressesEvent 类对象,这个对象描述了整个事件和一系列按钮状态的改变。例子4-3展示了视图控制器如何实现选择一个按钮的初级处理过程。当你处理触摸事件,并且实现了 press 事件处理的时候,如果你实现了 press 事件中的任何一个处理方法,你应该全部实现那四个方法。
Listing 4-3 响应低级别按压事件
override func pressesBegan(presses: Set, withEvent event: UIPressesEvent?) { for item in presses { if item.type == .Select { self.view.backgroundColor = UIColor.greenColor() } } } override func pressesEnded(presses: Set, withEvent event: UIPressesEvent?) { for item in presses { if item.type == .Select { self.view.backgroundColor = UIColor.whiteColor() } } } override func pressesChanged(presses: Set, withEvent event: UIPressesEvent?) { // ignored } override func pressesCancelled(presses: Set, withEvent event: UIPressesEvent?) { for item in presses { if item.type == .Select { self.view.backgroundColor = UIColor.whiteColor() } } }