UITapGestureRecognizer 在 iPad 上横向失败

Posted

技术标签:

【中文标题】UITapGestureRecognizer 在 iPad 上横向失败【英文标题】:UITapGestureRecognizer fails on iPad in landscape orientation 【发布时间】:2012-11-25 20:04:46 【问题描述】:

我正在开发一个具有UITapGestureRecognizer 的单视图应用程序。我注意到当我在 iPad 上尝试时,无法识别水龙头。在我使用 1x/2x 按钮缩放应用程序后,水龙头开始工作。我做错了什么?

我已将其缩小到一个非常小的样本。我从 XCode “Single View Application”开始,下面是viewDidLoad

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    info = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 200, 20)];
    [self.view addSubview:info];

    tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    [self.view addGestureRecognizer:tapper];

这是我目前所知道的:

适用于 iPhone 大小的屏幕。 在 iPad 上以纵向方向工作。 在 iPad 上以 横向 方向失败,直到视图缩放 1x/2x,然后它开始工作(并在缩放回原始缩放级别后继续工作)。 与 iPad 模拟器表现出相同的行为。

完整的代码在GitHub repository 中,因此您可以查看整个内容或尝试一下。 XCode 4.5.1、iPad 视网膜、ios 6.0.1。

【问题讨论】:

对我来说,该项目从一开始就在 iPad 模拟器中运行良好,无需缩放。 @ParamasivanSamuttiram:很有趣,谢谢。我想知道有什么不同。 @GregHewgill 我看到你在横向模式下启动它时的行为相同。 【参考方案1】:

我发现,如果我在应用程序的 plist 中删除“支持的界面方向”下的所有条目,这个问题就会消失。或者,如果您在目标设置的摘要屏幕上选中“状态栏”设置的“在应用程序启动期间隐藏”选项,这也可以修复它:

我认为这些选项中的任何一个都应该修复这个错误,但它们都可以。

显然,如果您确实使用“支持的界面方向”选项,在 iOS 6 中,您仍然可以通过supportedInterfaceOrientations(iOS 5 中的shouldAutorotateToInterfaceOrientation:)以编程方式控制允许的方向。

【讨论】:

这似乎是 iOS 6 的错误,我已通过 bugreport.apple.com 报告。 如果我删除所有支持的界面方向,应用程序似乎总是以纵向模式启动,即使在 iPad 上以横向模式保持也是如此。也就是说,状态栏移动到屏幕的一侧(短边),然后回到顶部(长边)。当然,支持的界面方向设置控制应用程序启动时发生的情况,在其任何代码运行之前。 (我的应用仅适用于横向模式。) 感谢您提交问题的错误报告(我同意这似乎是一个错误),但不幸的是,这种解决方法似乎对我不起作用。 就是这样!如果我从原始项目开始(如在 GitHub 上)并简单地勾选状态栏的“应用程序启动期间隐藏”,原始问题似乎神秘地消失了。我仍然希望在应用程序运行时出现状态栏,所以我将应用程序statusBarHidden = NO 设置为viewDidLoad。这会导致状态栏在应用加载时消失一小段时间,然后重新出现,这目前是可以接受的。

以上是关于UITapGestureRecognizer 在 iPad 上横向失败的主要内容,如果未能解决你的问题,请参考以下文章

在 UITapGestureRecognizer 上添加参数

在 UITapGestureRecognizer 中更改字体

使用 UITapGestureRecognizer 无法识别的选择器

带有点击事件的 UITapGestureRecognizer

UITapGestureRecognizer 和 touchesBegan 用于相同的视图

UIButton 上的 UITapGestureRecognizer