我有一个自定义 UIButton,其中 UILabel 添加为子视图.仅当我在上界下方约 15 点触摸按钮时,按钮才会执行给定的选择器.当我点击该区域上方时,什么也没有发生.
我发现它不是由于按钮和标签的错误创建引起的,因为在我将按钮向下移动大约 15 px 后它可以正常工作.
更新我忘了说位于 UINavigationBar 下方的按钮和按钮上部的 1/3 没有触摸事件.
图片在这里p>
带有 4 个按钮的视图位于 NavigationBar 下方.并且当触摸顶部的篮球"时,BackButton 得到触摸事件,当触摸顶部的钢琴"时,rightBarButton(如果存在)得到触摸.如果不存在,则什么都没有发生.
我没有在应用文档中找到这个记录在案的功能.
我还发现 this 主题与我的问题有关,但也没有答案.
我找到了答案 这里(苹果开发者论坛).
Keith 在 Apple Developer Technical Support 上,2010 年 5 月 18 日(iPhone OS 3):
<块引用>我建议您避免在靠近导航栏或工具栏的位置使用触敏 UI.这些区域通常被称为倾斜因素",使用户更容易在按钮上执行触摸事件,而不会遇到执行精确触摸的困难.例如,UIButton 也是如此.
但如果你想在导航栏或工具栏接收到触摸事件之前捕获它,你可以继承 UIWindow 并覆盖:-(void)sendEvent:(UIEvent *)event;
我还发现,当我触摸 UINavigationBar 下的区域时,location.y 定义为 64,但不是.所以我做了这个:
CustomWindow.h
@interface CustomWindow: UIWindow@结尾
自定义窗口.m
@implementation 自定义窗口- (void) sendEvent:(UIEvent *)event{布尔标志 = 是;开关([事件类型]){案例 UIEventTypeTouches://[self catchUIEventTypeTouches: 事件];如果您需要对事件执行某些操作,请执行for (UITouch *touch in [event allTouches]) {if ([触摸阶段] == UITouchPhaseBegan) {for (int i=0; i<[self.subviews count]; i++) {//获取屏幕上的手指位置CGPoint location = [touch locationInView:[self.subviews objectAtIndex:i]];//报告触摸NSLog(@"[%@] touchesBegan (%i,%i)", [[self.subviews objectAtIndex:i] class],(NSInteger) location.x, (NSInteger) location.y);if (((NSInteger)location.y) == 64) {标志=否;}}}}休息;默认:休息;}如果(!标志)返回;//什么都不做/*重要*/[super sendEvent:(UIEvent *)event];/*重要*