我有一个自定义UIControl,当点击时,进入确认状态,再次点击时,执行所需的操作。
如果用户在屏幕上的任何其他位置进行交互,我希望此控件返回其初始状态。是否有非侵入性的方法来实现这一目标?
澄清:如果我无法在此控件中包含代码,我认为代码是入侵的。我想给这个代码的另一个应用程序开发,他们可以用来将控件添加到他们的应用程序,而不必在应用程序中的任何其他地方乱码。如果这是不可能的,那很好,但问题是如何非侵入地实现这一目标。
答案 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
}
}
}
希望这有帮助。