4

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

如果用户在屏幕上的其他任何地方进行交互,我想让这个控件回到它的初始状态。有没有一种非侵入性的方法来实现这一点?

澄清:如果我不能将代码包含在此控件中,我认为代码具有侵入性。我想为另一个应用程序的开发人员提供此代码,他们可以使用这些代码将控件添加到他们的应用程序中,而不必在应用程序的其他任何地方乱用代码。如果这是不可能的,那很好,但问题是如何以非侵入性的方式实现这一点。

4

2 回答 2

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协议。

于 2013-06-27T17:16:05.000 回答
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
        }
    }
}

希望这可以帮助。

于 2013-06-27T17:16:25.750 回答