UIButton的一半区域无法响应触摸事件

3
我有一个UIView,我将其用作临时工具栏。它包含几个UIButton(我认为是六个)以水平排列。
第五个按钮只有在我点击其左侧一半时才会响应[TouchUpInside]事件,而其他所有按钮都能正常工作。
我已经疯狂地确认没有其他视图重叠在它上面等,但一切似乎都没问题。
有什么办法可以进一步调查吗?是否有任何方法可以查看“事件检查器”,以查看触摸消息可能去哪里?
6个回答

8

很可能,另一半被遮挡住了,因为有一个透明的视图挡住了它。查看按钮所有兄弟视图的框架:

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

查看按钮上方的任何框架(该数组从底部到顶部排序),并检查它们是否与其重叠。

如果没有重叠,则查看整个窗口是否有任何遮盖按钮的视图。


这个输出看起来一切正常 - 所有视图相距45像素,所有按钮宽37像素 - 没有重叠。不过还是谢谢你的提示! - Brad
这绝对是调试问题的最佳方法。 - Praveen S
如果您正在使用Storyboard,您还可以使用“查看调试层次结构”工具来查看当前视图层的布局,以查看是否有透明的东西在顶部。 - Adam

6
问题如下:
“第六”个按钮是一种“信息灯”类型的按钮。由于某种奇怪的原因,即使该按钮的边界明显超出了有问题的“第五”个按钮的边界,该“信息灯”按钮似乎会在其边界框之外获取触摸。
当我执行以下操作之一时:
  1. 将“信息灯”按钮移动到离“第五”个按钮更远的位置
或者
  1. 将“信息灯”按钮更改为常规(圆角矩形)按钮
问题就解决了!
请参见此图像中最右侧的两个按钮:

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类型后,按钮无法再与之交互。通过勾选“启用用户交互”复选框,我解决了这个问题。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接