TVOS UIViewController 没有收到 touchesBegan 或 touchesMoved

Posted

技术标签:

【中文标题】TVOS UIViewController 没有收到 touchesBegan 或 touchesMoved【英文标题】:TVOS UIViewController does not receive touchesBegan or touchesMoved 【发布时间】:2016-03-24 11:24:51 【问题描述】:

我正在为 tvOS 编写游戏,该游戏需要使用触控板在屏幕上移动对象 - 而不是鼠标指针在 Mac 上移动。我遇到的问题是,在我的游戏中,UIViewController 没有接收到 touchesBegan 或 touchesMoved。在网上阅读了一些关于 touchesBegan not working on tvOS 的胡言乱语后,我写了一个小程序来测试这个理论

ViewController.h:

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController 
    CGPoint cursorLocation;
    UIImageView* cursorImage;

@end

ViewController.m:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    cursorImage = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 92.0, 92.0)];
    cursorImage.center = CGPointMake(CGRectGetMidX([UIScreen mainScreen].bounds), CGRectGetMidY([UIScreen mainScreen].bounds));
    cursorImage.image = [UIImage imageNamed:@"Cursor"];

    cursorImage.backgroundColor = [UIColor clearColor];
    cursorImage.hidden = NO;
    [self.view addSubview:cursorImage];



- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 
    cursorLocation = CGPointMake(-1, -1);


- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 
    UITouch* touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.view];
    if ((cursorLocation.x == -1) && (cursorLocation.y == -1)) 
        cursorLocation = [touch locationInView:self.view];
     else 
        float xDiff = location.x - cursorLocation.x;
        float yDiff = location.y - cursorLocation.y;
        CGRect rect = cursorImage.frame;
        if ((rect.origin.x + xDiff >=0) && (rect.origin.x + xDiff <= self.view.frame.size.width)) 
            rect.origin.x += xDiff;
        
        if ((rect.origin.y + yDiff >=0) && (rect.origin.y + yDiff <= self.view.frame.size.height))  
            rect.origin.y += yDiff;
            cursorImage.frame = rect;
            cursorLocation = location;
        
    


@end

我的测试效果很好!我的问题是,什么会阻止 touchesBegan 或 touchesMoved 在我的完整应用程序中被 ViewController 接收(对于这个问题来说,它的来源太长了)? Spitball away - 我没有想法,我欢迎你提出任何建议!

【问题讨论】:

我建议先阅读here 上的 tvOS 文档。我想你可能想要 pressesBegan ......而且这已经被问过了here 如您所见,touchesBegan 工作正常(如我的测试代码所示)。所以问题是,为什么它不能在完整的应用程序中工作?而且,如果 pressesBegan 是正确的,那么为什么没有 pressesMoved 呢? 作为记录,pressesBegan 也没有被传递给视图控制器。很奇怪。 【参考方案1】:

您的示例代码没有任何手势识别器,但您的完整应用可能有。某些手势可能会导致 touchesBegan: 永远不会发送到响应者链。

您应该重试整个应用程序,但要尽可能多地删除手势识别器,您可能会发现 touchesBegan: 方法开始被调用。

如果您确定问题实际上是一个手势,那么您可以通过在有问题的手势上将cancelsTouchesInView 设置为NO 或将delaysTouchesBegan 设置为NO(虽然这应该已经是默认设置了)。

【讨论】:

这是一个很好的建议。但是一个我已经试过了。没修。目前我怀疑一个视图可能会阻塞响应者链。【参考方案2】:

如果启用 tvOS 焦点引擎,将不再调用触摸事件。只需将UIButton 放在屏幕上,或者例如使用 UITabBarController` 将启用焦点引擎并禁用触摸事件。

如果您仍然需要触摸事件,请查看此答案:UIButton blocking touchesBegan and touchesMoved

【讨论】:

以上是关于TVOS UIViewController 没有收到 touchesBegan 或 touchesMoved的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中使 UIViewRepresentable 在 tvOS 上具有焦点?

在 tvOS 10 GM 上打开 UIAlertController 时焦点消失

tvOS - 在推送视图控制器转换期间捕获 MENU 按钮按下

tvOS - UIButton 在聚焦时没有动画

Xcode 9 启动图像集没有任何适用的内容,tvOS/iOS

UITapGestureRecognizer 没有在 tvOS 上接收输入