如何以非侵入方式检测UIControl外的任何位置的交互?

时间:2013-06-27 16:08:46

标签: ios uicontrol

我有一个自定义UIControl,当点击时,进入确认状态,再次点击时,执行所需的操作。

如果用户在屏幕上的任何其他位置进行交互,我希望此控件返回其初始状态。是否有非侵入性的方法来实现这一目标?

澄清:如果我无法在此控件中包含代码,我认为代码是入侵的。我想给这个代码的另一个应用程序开发,他们可以用来将控件添加到他们的应用程序,而不必在应用程序中的任何其他地方乱码。如果这是不可能的,那很好,但问题是如何非侵入地实现这一目标。

2 个答案:

答案 0 :(得分:1)

只有当触摸发生在您UITapGestureRecognizer范围之外时,您才会想到UIControl置于触发解雇的所有内容之上。

这样的东西
- (void)presentConfirm {
   // whatever 

    self.dismissRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss:)];
    self.dismissRecognizer = self;
    [self.view addGestureRecognizer:self.dismissRecognizer];
}

- (void)dismiss:(UIGestureRecognizer *)gestureRecognizer {
    // do stuff

    [self.view removeGestureRecognizer:self.dismissRecognizer];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    CGPoint touchPoint = [touch locationInView:self.view];
    return !CGRectContainsPoint(self.control.frame, touch));
}

基本上,只有当触摸发生在dismiss框架之外时,我才会触发UIControl方法(我假设您的控件被引用为self.control)。

此外,您还需要一个声明为

dismissRecognizer属性
@property (nonatomic, strong) UITapGestureRecognizer *dismissRecognizer;

为防止出现警告,您还应声明控制器符合UIGestureRecognizerDelegate协议。

答案 1 :(得分:0)

您可以尝试使用touchesBegan方法完成此操作:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    if(myUIControl.isInConfirmState){ // check if your control is in confirmed state

    UITouch* touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

        if(!CGRectContainsPoint(myUIControl.frame, touchLocation)){
    // set myUIControl to it's initial state
        }
    }
}

希望这有帮助。