ios - UIButton 无法在 iPhone 屏幕底部正确注册触摸

标签 ios objective-c uibutton interface-builder

我有一个应用程序,其中有许多不同的按钮排列在计算器中,例如正方形/矩形格式。它实际上与默认的 iOS 计算器极为相似。大约有 6 行,每行 4 列按钮。

问题

我遇到的问题涉及底行的按钮(大约是 iPhone 4 屏幕的底部 10)。它们在按下时表现不正常,因为当按下时,必须按住它们(大约不到一秒钟)才能注册“按钮按下”。这与标准的短按相反。

除此底行外,没有其他按钮以这种方式运行。

此外,如果点击这些按钮的上边缘,它们会正常运行,一旦被触摸就会做出响应。这让我相信按钮本身不是问题,但我的 View 布局存在一些问题。

还应注意,此问题仅存在于物理设备上。在模拟器上,按钮表现正常。

上下文

包含这些按钮的 View 不是应用程序的 Root View Controller 。相反,它被转换成这样(这里没什么特别的):

[self presentViewController:navController animated:YES completion:nil];

self 是 Root View Controller

我遇到问题的 View Controller 包含在导航 Controller 中,并由您在上面看到的 Root View Controller 以模态方式呈现。

到目前为止我尝试了什么

  • 打开和关闭自动布局:同样的问题

  • 重新排列 View 的层次结构:我将有问题的按钮移到了所有其他按钮的顶部和后面 结果相同的 View :同样的问题

  • 多台设备(iPhone 4、4s、5):同样的问题(尽管按钮在 3.5 英寸和 4 英寸模拟器上响应正常)

  • 测试其他应用(当其他应用按下此区域的按钮时,它们表现正常)

附加信息

  • Interface Builder 中为有问题的 View Controller 布置了一切
  • 所有的按钮都是标准设置的系统按钮,除了文字之外完全一样。
  • 屏幕的所有元素(按钮、标签等)都是“ View ”的 subview
  • 按钮相互齐平,重叠不应超过一两个像素。
  • 有问题的按钮尺寸为:80 宽 X 44 高。
  • 有问题的按钮与屏幕底部齐平
  • 除了按钮之外,还有一个 UIImage 和几个标签,但它们位于屏幕顶部,不会以任何方式与任何按钮重叠。

最佳答案

此问题的原因是 Apple 似乎在屏幕底部放置了一个 GestureRecognizer,它会延迟任何其他 View 中的触摸。 在应用程序窗口上摆弄手势识别器后,我想出了一个包含 UIButton 子类的解决方案:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    BOOL inside = [super pointInside: point withEvent: event];

    if (inside && !self.isHighlighted && event.type == UIEventTypeTouches)
    {
        self.highlighted = YES;
    }

    return inside;
}

尽管 touchesBegan: 被延迟调用,但正在调用给定的方法。检查 View 是否位于屏幕底部可能适合防止此修复可能出现的任何副作用。

关于ios - UIButton 无法在 iPhone 屏幕底部正确注册触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23046539/

相关文章:

ios - NSURLConnection,web 服务在后台 ios 中不工作

ios - swift : click on a UIButton with code

iphone - 使用分配后如何初始化UIButton的类型?

ios - 我可以快速支持协议(protocol)的多重继承吗?

ios - 有没有办法让控制台日志告诉我我在哪个 View ?

ios - UserDefault 总是返回 nil

iphone - 在 Instruments 中分析 iPhone 应用程序时缺少符号名称

ios - 如何在 cocos2d-iPhone v3 中实现 jsbindings?

ios - AVAudioPlayer 被 MPMusicPlayerController 中断

ios - UIButton 对 Swift 中的第一次按下没有反应