作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个自定义的 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));
}
基本上,只有当触摸发生在 UIControl
框架之外时,您才会触发 dismiss
方法(我假设您的控件被引用为 self.control
).
此外,您还需要一个声明为 dismissRecognizer
的属性
@property (nonatomic, strong) UITapGestureRecognizer *dismissRecognizer;
为了防止出现警告,您还应该声明您的 Controller 符合 UIGestureRecognizerDelegate
协议(protocol)。
关于ios - 如何以非侵入方式检测 UIControl 之外任何地方的交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17348077/
我是一名优秀的程序员,十分优秀!