我有一个自定义 UIControl,当点击它时,它会进入确认状态,当再次点击时,它会执行所需的操作。
如果用户在屏幕上的其他任何地方进行交互,我想让这个控件回到它的初始状态。有没有一种非侵入性的方法来实现这一点?
澄清:如果我不能将代码包含在此控件中,我认为代码具有侵入性。我想为另一个应用程序的开发人员提供此代码,他们可以使用这些代码将控件添加到他们的应用程序中,而不必在应用程序的其他任何地方乱用代码。如果这是不可能的,那很好,但问题是如何以非侵入性的方式实现这一点。
您可以考虑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
协议。
您可以尝试使用 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
}
}
}
希望这可以帮助。