本文由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() } } }