在视图外检测 UITouch

Detecting UITouch outside of view

我有一个 UIButton 作为 "confirm" 按钮。基本上,我希望它需要两次点击来触发它的动作,所以当你第一次点击它时,图片会变成 "are you sure" 类型的图像,此时,第二次点击会触发动作。

这很好用,但我想对其进行设置,以便点击按钮以外的任何地方都会将其再次重置回第一张图片,因此需要再次点击 2 次。

有什么方法可以检测用户是否触摸了 UIButton 之外的东西;也许有没有办法给它 "focus" 并检查焦点退出?

我想到了 UITouch,但它只会将其事件发送到您正在触摸的响应它的视图。

如您所知,您可以在按下视图时使用 UIControlEvent.touchUpInside

如果您想查看某个媒体何时在视图之外,您可以 UIControlEvent.touchUpOutside 而不是

button.addTarget(self, action:<SELECTOR>,forControlEvents: UIControlEvents.TouchUpOutside)

您可以添加 UITapGestureRecognizer 以获取用户触摸外部按钮事件

@interface YourViewController ()
@property NSInteger tapCount;
@property (weak) UITapGestureRecognizer *gestureRecognizer;
@end

添加UITapGestureRecognizer

- (IBAction)buttonPressed:(id)sender {
    self.tapCount ++;
    if (self.tapCount == 1) {
        // change button label, image here

        // add gesture gesture recognizer
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOutSideAction)];
        [tap setNumberOfTapsRequired:1];
        [[[UIApplication sharedApplication] keyWindow] addGestureRecognizer:tap];
        self.gestureRecognizer = tap;
    } else if (self.tapCount == 2) {
        // tap two times

        self.tapCount = 0;
    }
}

- (void)tapOutSideAction {
    // reset button label, image here

    // remove gesture recognizer
    self.tapCount = 0;
    [[[UIApplication sharedApplication] keyWindow] removeGestureRecognizer:self.gestureRecognizer];
}

UITapGestureRecognizer 附加到按钮的超级视图(可能是视图控制器的内容视图)。将 userInteractionEnabled 设置为 true。将重置按钮的代码放入点击手势识别器的处理程序中。