admin管理员组文章数量:1567271
iOS开发中多手势冲突解决方案
iOS开发中我们经常会使用到手势,合理的运用手势会使我们的app拥有更好的体验,但是在使用手势的同时也要注意避免手势和手势间,以及手势和其他控件间的冲突。本文就主要介绍在遇到多手势冲突的问题是, 怎么合理解决问题, 运用多手势营造更好的体验?
手势冲突解决方案
首先, 先介绍我在项目开发中遇到的手势冲突的情景, 主要使用到的手势就是UIScreenEdgePanGestureRecognizer, UIPanGestureRecognizer,UITapGestureRecognizer以及scrollview的panGestureRecognizer, 其中会造成冲突的就有UIScreenEdgePanGestureRecognizer,UIPanGestureRecognizer,scrollview的panGestureRecognizer, 这里主要是滑动手势引起的冲突, 其实解决方法也比较简单, 个人理解就是设置手势的优先级, 哪个手势最先识别, 哪个最后识别?
其实解决方法也比较简单:查看UIGestureRecognizer文档, 我们会发现这样一个方法:
// create a relationship with another gesture recognizer that will prevent this gesture's actions from being called until otherGestureRecognizer transitions to UIGestureRecognizerStateFailed
// if otherGestureRecognizer transitions to UIGestureRecognizerStateRecognized or UIGestureRecognizerStateBegan then this recognizer will instead transition to UIGestureRecognizerStateFailed
// example usage: a single tap may require a double tap to fail
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;
其实也就是说, 某个手势会在另外一个手势识别出来后, 响应失败, 就响应另外一个手势,其实也就是设置手势的响应优先级。
在我的项目中, 屏幕侧滑的优先级是最高的,关于不同区域的滑动手势, 其实是可以根据响应区域来区分的, 不一定需要设置优先级。
我的处理方式如下:
//需要设置屏幕边缘滑动优先级高于正常滑动手势
[panGestureRecognizer requireGestureRecognizerToFail:screenLeftEdgePanGestureRecognizer];
[panGestureRecognizer requireGestureRecognizerToFail:screenRightEdgePanGestureRecognizer];
[self.scrollViewBooks.panGestureRecognizer requireGestureRecognizerToFail:gesture];
我这里涉及到左, 右屏幕边缘的侧滑手势, 设置起来可能比较多。
其实还有一种遍历的设置方法:
//设置scrollView的滑动优先级低于屏幕边缘滑动
NSArray *gestureArray = self.view.gestureRecognizers;
//当是侧滑手势的时候设置scrollview需要此手势失效才生效即可
for (UIGestureRecognizer *gesture in gestureArray) {
if ([gesture isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
[self.scrollViewBooks.panGestureRecognizer requireGestureRecognizerToFail:gesture];
}
}
这里主要是应对scrollView的滑动手势对屏幕边缘滑动手势的影响, 这种设置可能更高效。
总结
其实, 手势冲突最根本的解决方法就是尽量避免多手势的问题, 不使用相互冲突的手势, 如果真的没法避免, 建议大家使用上述的方法来解决。
版权声明:本文标题:iOS开发中多手势冲突解决方案 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1725726850a1039063.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论