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

时间:2015-03-09 15:10:11

标签: ios objective-c

我偶然发现了这个问题,我不确定处理它的最佳方法是什么。这个问题很容易重现,我已经提出了a simple demo project on GitHub for demonstration,但这是它的要点。

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

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    BOOL inside = CGRectContainsPoint(self.bounds, point);
    NSLog(@"pointInside Called");
    return inside;
}

运行应用程序时,如果我点击屏幕上的任何位置键盘,则会调用pointInside方法;在键盘上键入不会触发pointInside方法。

在离开键盘的同时,我会在后台发送应用程序,然后返回应用程序。现在,每次我在键盘上输入时,都会调用pointInside方法!我找到的唯一方法是修复'问题是将UITextEffectsWindow设置为keyAndVisible;但这并不可行,因为它可能引入其他副作用。

知道怎么处理这个吗?我的问题是我们在我们的应用程序中使用此方法来解除当用户点击它之外的弹出窗口。但是弹出窗口中有一个UITextField,当用户开始输入时,我们显然不想丢弃弹出窗口...

提前致谢

2 个答案:

答案 0 :(得分:0)

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

a)检查事件的触摸并忽略请求,如果它没有触及您的窗口

b)使用位于弹出窗口上方的gestureRecognizer来确定如何对弹出窗口的打开状态做什么

c)(这就是我们所做的......来自识别者之前的旧代码)覆盖touchesBegan& co在窗口上并将点击传递给代理

答案 1 :(得分:0)

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

@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];
}