ios UIButton的一半不响应触摸事件

ki1q1bka  于 2023-06-07  发布在  iOS
关注(0)|答案(6)|浏览(213)

我有一个UIView-我用它作为一个临时工具栏。它包含几个UIButton。(我想是六个)横排。
第五个按钮只会在我点击它的左半部分时响应[TouchUpInside]事件,而其他所有按钮都能正常工作。
我已经疯狂地确保没有任何其他视图重叠它,等等-一切似乎都很好。
有什么办法进一步调查吗?有没有办法看到一个“事件检查器”,看看触摸消息可能会去哪里?

2sbarzqh

2sbarzqh1#

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

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

看看按钮上方的任何框架(数组是从下到上排序的)是否与它重叠。
如果没有,请查看整个窗口是否有覆盖按钮的视图。

ntjbwcob

ntjbwcob2#

问题如下:
“第六”按钮是“信息灯”型按钮。由于一些奇怪的原因--尽管这个按钮的边界显然在冒犯的“第五个”按钮的边界之外--“信息灯”按钮似乎在它的边界框之外获得了一点触摸。
当我:
1.将“信息灯”按钮从“第五”按钮移得更远
─或─
1.将“信息灯”按钮更改为常规(圆形矩形)按钮
问题就解决了!
请参阅此图像中最右侧的两个按钮:

yqhsw0fo

yqhsw0fo3#

我想你的超级视图界限可能有点太小了吧?尝试将您的超级视图背景颜色更改为红色或一些生动的颜色,并检查其边界。

szqfcxe2

szqfcxe24#

您可以尝试将此技术与NSLog()一起使用,以记录事件并了解可能发生的情况。我不确定是否有更好的方法来记录事件:
在UITableView中观察捏合多点触摸手势

klh5stk1

klh5stk15#

刚刚遇到这个奇怪的问题,以及和理解问题的本质斗争后,遇到了这个职位。谢谢你的帮助提示!我知道这是一个老问题,但这是我如何能够以两种方式解决它。第一个是最初创建系统信息灯按钮,然后简单地检索按钮图像并使用该图像创建一个自定义按钮,忽略初始按钮。这样做的好处是,您始终可以获得最新的信息灯图形,以防它在操作系统中发生变化。缺点是新版本的操作系统可能会在某个时候决定不以这种方式提供映像。

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];
bis0qfac

bis0qfac6#

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

相关问题