iOS8:点击表单外部关闭表单

7
我们目前使用的解决方案类似于这里提到的解决方案(请参见Ares的答案)。但在iOS8上似乎不起作用。
我有一个表单工作表,希望用户一旦点击了遮罩视图“后面”的地方,就立即关闭它。 以前,通过向窗口添加手势识别器并检查点击位置是否在当前表单工作表之外来实现这一点似乎是可能的;
我还注意到,如果设备处于横向模式,则需要转换点(交换x和y)。除此之外,它现在只接收从表单工作表内部发生的手势,而以前屏幕上的任何触摸手势都会触发事件。
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapBehind:)];
    self.recognizer.numberOfTapsRequired = 1;
    self.recognizer.cancelsTouchesInView = NO;
    [self.view.window addGestureRecognizer:self.recognizer];
}

- (void)handleTapBehind:(UITapGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateEnded)
    {
        CGPoint location = [sender locationInView:nil];
        if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) && IOS8)
        {
            location = CGPointMake(location.y, location.x);
        }

        // if tap outside pincode inputscreen
        BOOL inView = [self.view pointInside:[self.view convertPoint:location     fromView:self.view.window] withEvent:nil];
        if (!inView)
        {
            [self.view.window removeGestureRecognizer:sender];
            [self dismissViewControllerAnimated:YES completion:nil];
        }
    }
}
1个回答

9

正如您所引用的主题中提到的那样,您应该添加一个UIGestureRecognizerDelegate并实现以下方法:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    return YES;
}

我不确定你的意思是什么?这与iOS8中的API更改有何关系?所提到的代码在iOS7中运行良好。还是这是绕过iOS8中的一个bug的方法? - Kevin R
为了使您发布的代码在iOS8中正常工作,请将UIGestureRecognizerDelegate添加到您的self.recognizer并添加这些委托方法。 - Erich
1
仅需补充一点:我使用nib文件来创建视图控制器。在这种情况下,在viewDidLoad:时,self.view.window将为nil,因此我必须在viewDidAppear:上设置手势识别器才能使其正常工作。 - Tamara Bernad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接