UIButton的一半没有响应触摸事件

时间:2010-10-16 01:41:50

标签: iphone ios

我有UIView - 我正在使用它作为临时工具栏。它包含几个UIButton个。 (六,我认为)在横排。

第五个按钮只会在我点击左半部分时响应[TouchUpInside]个事件 - 而所有其他按钮都能正常工作。

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

有关如何进一步调查的任何想法?有没有办法看到“事件检查员”看看触摸信息的去向?

6 个答案:

答案 0 :(得分:8)

最可能的是,另一半被透明视图覆盖,阻碍了它。查看按钮的所有兄弟视图的框架:

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

看看按钮上方的任何框架(阵列是从下到上排序)是否与它重叠。

如果没有,请查看整个窗口是否有任何有关按钮的视图。

答案 1 :(得分:6)

问题如下:

“第六”按钮是“信息灯”类型按钮。出于一些奇怪的原因 - 即使这个按钮的边界明显超出了违规的“第五”按钮的范围 - “信息灯”按钮似乎在它的边界框之外有点接触。

当我要么:

  1. 将“信息灯”按钮移离“第五个”按钮
  2. -OR -

    1. 将“信息灯”按钮更改为常规(圆形矩形)按钮
    2. ......问题消失了!

      请参阅此图片中最右侧的两个按钮:

      alt text

答案 2 :(得分:6)

我猜你的超视范围可能有点太小了?尝试将您的超视图背景颜色更改为红色或一些鲜艳的颜色并检查其边界。

答案 3 :(得分:0)

您可以尝试将此技术与NSLog()一起使用来记录事件并了解可能发生的事情。我不确定是否有更好的方法来记录事件:

Observing pinch multi-touch gestures in a UITableView

答案 4 :(得分: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

第二种方法,我决定使用它,以便我知道它可用,并且在OS图形改变的情况下匹配我的启动画面艺术,是遵循相同的技术,只需将原始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];

答案 5 :(得分:0)

我注意到在选择infoLight类型后,该按钮无法再与之交互。通过选中复选框"用户交互已启用"我解决了这个问题。