pointInside:withEvent:在iOS8上键入键盘时调用

pointInside:withEvent:在iOS8上键入键盘时调用,ios,objective-c,Ios,Objective C,我偶然发现了这个问题,我不确定什么是最好的解决方法。这个问题很容易复制,我已经说过了,但这里是它的要点 假设我有一个iPad应用程序,它的主视图中有一个UITextField。下面是一个小型UIView子类,它实现了pointInside:withEvent: - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { BOOL inside = CGRectContainsPoint(self.bounds, poin

我偶然发现了这个问题,我不确定什么是最好的解决方法。这个问题很容易复制,我已经说过了,但这里是它的要点

假设我有一个iPad应用程序,它的主视图中有一个UITextField。下面是一个小型UIView子类,它实现了pointInside:withEvent:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    BOOL inside = CGRectContainsPoint(self.bounds, point);
    NSLog(@"pointInside Called");
    return inside;
}
运行应用程序时,如果我点击屏幕上除了键盘以外的任何地方,就会调用pointInside方法;在键盘上键入不会触发pointInside方法

在不使用键盘的情况下,我会在后台发送应用程序,然后返回应用程序。现在,每次我在键盘上键入,就会调用pointInside方法!我发现“修复”该问题的唯一方法是将UITextEffectsSwindow设置为keyAndVisible;但这并不可行,因为它可能会带来其他副作用

你知道怎么处理吗?我的问题是,我们在应用程序中使用这种方法,当用户点击弹出窗口的外部时,它会关闭弹出窗口。但是弹出窗口中有一个UITextField,我们显然不想在用户开始键入时放弃弹出窗口


提前谢谢

我没有真正的答案,听起来确实不对,但我有两个解决办法

a) 检查事件的触动,如果没有触动窗口,则忽略请求

b) 使用位于弹出窗口上方的手势识别器确定如何处理弹出窗口的打开状态


c) (这就是我们要做的…识别器之前的旧代码)覆盖窗口上的touchesbeated&co并将单击传递给代表

我最后选择了添加到UIWindow的UIAppgestureRecognitor。自定义视图在移动到新窗口时将其添加,在取消分配时将其删除;工作正常,解决了我的问题:

@property (strong, nonatomic) UITapGestureRecognizer *outsideTapRecognizer;

- (void)willMoveToWindow:(UIWindow *)newWindow
{
    if(self.outsideTapRecognizer){
        [self.window removeGestureRecognizer:self.outsideTapRecognizer];
    }

    self.outsideTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOutside:)];
    [newWindow addGestureRecognizer:self.outsideTapRecognizer];
}

- (void)tapOutside:(UIGestureRecognizer *)gestureRecognizer {
    BOOL inside = CGRectContainsPoint(self.bounds, [gestureRecognizer locationInView:self]);
    if (!inside) {
        [self removeFromSuperview];
    }
}

- (void)dealloc
{
    [self.window removeGestureRecognizer:self.outsideTapRecognizer];
}

所有误报的原因都是坐标系。该代码询问触摸是否在接收触摸的视图范围内。当然是。而是对照某个子视图的框架检查该点。更好的方法是,在视图上附加一个点击手势识别器,点击会导致文本字段退出第一响应者。但点在视图中协调这并不能解释为什么在应用程序进入后台之前在键盘上键入时不调用pointInside,而是在应用程序进入后台之后调用。检查正常,没有假阳性。唯一的问题是,在一种情况下在键盘上键入时会调用该方法,而在另一种情况下则不会。我同意。我试图理解danh的意思对不起Daij Djan,我在回复danh的评论…奇怪/不幸的是,event.alltouch是空的,所以我无法检查它们属于哪个窗口。这是一个UITouchesEvent;我期待触摸:-)我完全同意-留下我所谓的b