为什么 UINavigationBar 会窃取触摸事件?

Why does UINavigationBar steal touch events?(为什么 UINavigationBar 会窃取触摸事件?)
本文介绍了为什么 UINavigationBar 会窃取触摸事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义 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];/*重要*

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Pushing UIViewController above UITabBar(将UIView控制器推送到UITabBar上方)
How to stop UIBarButtonItem text from truncating?(如何阻止UIBarButtonItem文本被截断?)
java.lang.IllegalStateException: SimpleTypeImpl should not be created for error type(异常:不应为错误类型创建SimpleTypeImpl)
Android IllegalArgumentException: The tag for fragment_XXX is invalid. Received: layout-sw600dp/fragment_XXX_0(Android IlLegalArgumentException:Fragment_XXX的标签无效。收到:Layout-sw600dp/Fragment_XXX_0)
iOS convert audio sample rate from 16 kHz to 8 kHz(IOS将音频采样率从16 kHz转换为8 kHz)
Enforcing an audio sampling rate in iOS(在iOS中强制音频采样率)