tvOS трогает начался, трогает переместил, трогает закругленный
Я запутался в том, как прикосновения сочетаются с родительскими взглядами. Для тестирования я построил простую программу, которая имеет 4 кнопки UIB. Класс Button отправляет сенсорные события вверх:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
for var i=0; i<4; i++ {
let button = Button(type: UIButtonType.System) as Button
button.frame = CGRectMake(0,0,200,100)
button.center = CGPoint(x: i*250+100,y: 50)
button.setTitle(String(i), forState: UIControlState.Normal)
self.view.addSubview(button)
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("ViewController touchesBegan",touches.count)
for touch in touches {
print(touch.locationInView(self.view).x,touch.locationInView(self.view).y)
}
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("ViewController touchesMoved",touches.count)
for touch in touches {
print(touch.locationInView(self.view).x,touch.locationInView(self.view).y)
}
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("ViewController touchesEnded",touches.count)
for touch in touches {
print(touch.locationInView(self.view).x,touch.locationInView(self.view).y)
}
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
print("ViewController touchesCancelled")
}
}
class Button : UIButton {
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("button",self.center,"touchesBegan")
self.nextResponder()?.touchesBegan(touches, withEvent: event)
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("button",self.center,"touchesEnded")
self.nextResponder()?.touchesEnded(touches, withEvent: event)
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("button",self.center,"touchesMoved")
self.nextResponder()?.touchesMoved(touches, withEvent: event)
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
print("button",self.center,"touchesCancelled")
self.nextResponder()?.touchesCancelled(touches, withEvent: event)
}
override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
if (self.focused) {
print("button",self.center,"YES didUpdateFocus")
} else {
print("button",self.center,"NO didUpdateFocus")
}
}
}
Я ожидал, что ВСЕ сенсорные элементы будут отображаться в сенсорных обработчиках ViewControllers, но это не так. Простой сдвиг вправо с помощью пульта tvOS показывает следующее:
button (100.0, 50.0) YES didUpdateFocus
button (100.0, 50.0) touchesBegan
ViewController touchesBegan 1
100.0 50.0
button (100.0, 50.0) touchesMoved
ViewController touchesMoved 1
116.728515625 50.0
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) NO didUpdateFocus
button (350.0, 50.0) YES didUpdateFocus
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesMoved
button (100.0, 50.0) touchesEnded
Почему я НЕ вижу "ViewController touchsMoved" после всех уведомлений "button touchsMoved"?
Я предполагаю, что это потому, что кнопка, которая инициировала касание, больше не "в фокусе", поэтому родительское представление игнорирует ответчик касания... но затем (i), почему некоторые из движений не отображаются в контроллере представления, пока кнопка не потеряла focus, и (ii) почему кнопка, находящаяся в фокусе, не показывает touchesMoved и отправляет это сообщение в ViewController?
Большое спасибо за любой свет, который кто-то может пролить на это.
Джим