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?

Большое спасибо за любой свет, который кто-то может пролить на это.

Джим

0 ответов

Другие вопросы по тегам