2010-10-16 96 views
3

我有一个UIView - 我正在使用它作为临时工具栏。它包含几个UIButton s。 (我觉得六)横向排列。UIButton的一半没有响应触摸事件

第五按钮上只会为[TouchUpInside]事件作出反应,当我点击左半它 - 而所有其他按键正常工作。

我疯了,确保没有任何其他视图重叠,等等 - 一切似乎都没问题。

任何有关如何进一步调查的想法?有没有办法看到一个“事件检查员”,看看触摸消息可能会发生什么?

回答

6

问题如下:

“第六个”按钮是一个“信息灯”类型的按钮。出于某种奇怪的原因 - 尽管这个按钮的边界明显超出了有问题的“第五个”按钮的范围 - “信息灯”按钮似乎在它的边界框之外获得了一点触摸。

当我任一:

  1. 移动的 “信息光” 按钮从 “十五” 按钮更远

- 或 -

  • 将“Info Light”按钮更改为常规(Round Rect)按钮
  • ...问题出现了办法!

    见最右边的两个按钮,这个形象:

    alt text

    7

    最有可能的,另一半则是通过阻碍它的透视图覆盖。看到的按钮的所有兄弟视图的帧:

    for (UIView *v in myButton.superview.subviews){ 
        NSLog(NSStringFromCGRect(v.frame); 
    } 
    

    ,看看是否有按钮上方的帧(该阵列从下到上排序)与它重叠。

    如果他们不知道,看看整个窗口是否有覆盖按钮的任何意见。

    +0

    从这个输出一切看起来很正常 - 所有视图相距45px,所有按钮37px宽 - 不重叠。感谢您的提示,但! – Brad 2010-10-16 02:21:02

    +0

    这是迄今为止调试问题的最佳方法。 – 2012-08-07 16:16:08

    +0

    如果您正在使用Storyboard,还可以使用“View Debug Hierarchy”工具查看当前视图图层的布局,以查看透明的东西是否可以放在顶部 – Adam 2017-10-26 19:14:03

    6

    我猜你的上海华界可能是有点太小了?尝试将您的超级背景颜色更改为红色或鲜艳的颜色并检查其边界。

    0

    刚刚遇到了这个奇怪的问题,以及经过努力了解问题的本质,跑过这篇文章。感谢您的帮助提示!我知道这是一个古老的问题,但这是我通过两种方式解决问题的方式。首先是最初创建系统信息指示灯按钮,并简单地检索按钮图像,并使用该图像创建一个自定义按钮,忽略初始按钮。这样做的好处是,如果它在操作系统中发生变化,您总能获得最新的信息灯图形。缺点是新版本的操作系统可能会在某些时候决定不以这种方式提供图像。

    UIButton *button = [UIButton buttonWithType:UIButtonTypeInfoLight]; 
    UIImage *img = [button imageForState:UIControlStateNormal]; 
    button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setImage:img forState:UIControlStateNormal]; 
    button.showsTouchWhenHighlighted = YES; 
    [button addTarget:self action:@selector(infoSelected:) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *barButton = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease]; 
    [barItems addObject:barButton]; // NSMutableArray of tab bar items 
    

    第二种办法,我决定使用,让我知道这将是可用的,并且还可以的情况下,操作系统的图形变化符合我的启动画面的艺术,是遵循同样的技术,只需保存将原始PNG添加到磁盘并将其作为按钮的自定义图像添加到项目中。

    // Run these four lines just once in the simulator to save the original info 
    // light button image to disk and then eliminate these four lines and create the 
    // custom button with the image added to the project. Note that it may be a 1x or 
    // 2x image depending on the simulator device. So run it on both to get two 
    // versions (changing the name of course). 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeInfoLight]; 
    UIImage *img = [button imageForState:UIControlStateNormal]; 
    NSData *imgData = UIImagePNGRepresentation(img); 
    BOOL saved = [imgData writeToFile:@"/Users/Shared/InfoLight.png" atomically:NO]; 
    
    0

    我注意到,选择infoLight类型后,按钮不能再与之交互。通过选中“User Interaction Enabled”复选框,我解决了这个问题。