iOS手势冲突相关解决
来源:互联网 发布:mysql 创建存储过程 编辑:程序博客网 时间:2024/05/16 05:48
项目中遇到一个页面中是以一个scrollview横向Tab展示两个不同功能的显示,譬如消息和公告功能,但是由于滑动返回手势和scrollview的滑动返回手势冲突了,导致页面不再能够滑动返回。类似的还有图片浏览功能也出现过。
iOS系统中,滑动返回手势,其实是一个UIPanGestureRecognizer,系统默认的操作是只有滑动屏幕的左边的某个位置,UIPanGestureRecognizer才会起作用。UIScrollView的滑动手势也是UIPanGestureRecognizer。那在侧边滑动时,让UIScrollView的不响应事件就OK了嘛,首先想到了继承UIScrollView 重写下面的方法,让滑动侧边时scrollView不响应事件,根据响应者链,事件最终会传递给下方的滑动手势。
- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event { if (point.x < location xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed> 0 && location.x < “这个自己设定" && self.contentOffset.x <= 0) { return YES; } } } return NO;
} 需要侧边滑动时 panBack 返回YES,这时候,我让scrollView的手势和页面的滑动返回手势共存,scrollView不拦截手势,那不就可以滑动返回了吗。好了,测试一下,可以滑动返回,但是滑动返回时,为什么scrollView也跟着在滑动呢,太影响美观了,看来还需要另外的办法,我又回到了第一种办法时的想法,让scrollView切换的时候相应panGesture,滑动返回的时候不响应,那重写scrollView中的另外一个panGestureRecognizer的代理方法。
(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([self panBack:gestureRecognizer]) { return NO; } return YES;
}
第二种方法:
-(BOOL)gestureRecognizer:(UIGestureRecognizer )gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer )otherGestureRecognizer
{
// 首先判断otherGestureRecognizer是不是系统pop手势
if ([otherGestureRecognizer.viewisKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
// 再判断系统手势的state是began还是fail,同时判断scrollView的位置是不是正好在最左边
if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan &&self.contentOffset.x == 0) {
returnYES;
}
}
returnNO;
}
以上的代码都是在一个自定义的UIScrollView上的,重写上面的方法即可。然后让横向滚动的scrollView继承这个自定义UIScrollView就OK了。
原理: scrollView的pan手势会让系统的pan手势失效,所以我们只需要在系统手势失效且scrollView的位置在初始位置的时候让两个手势同时启用就可以了
第三种 假如我们的View是一个可滑动的View呢?例如ScrollView,TableView,CollectionView。由于它们自带了panGestureRecognizer 所以它们一起使用时可能会产生冲突,如何避免呢?我们可以设置一个手势依赖关系! Like this: NSArray *gestureArray = self.navigationController.view.gestureRecognizers;//获取所有的手势
//当是侧滑手势的时候设置panGestureRecognizer需要UIScreenEdgePanGestureRecognizer失效才生效即可
for (UIGestureRecognizer *gesturein gestureArray) {
if ([gesture isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
[self.tableView.panGestureRecognizer requireGestureRecognizerToFail:gesture];
}
}
- iOS手势冲突相关解决
- ios解决手势冲突
- iOS 完美解决iOS7 interactivePopGestureRecognizer 手势冲突
- iOS中解决各种手势冲突问题
- iOS 手势添加及冲突解决
- iOS 解决单击手势与UItableviewCell表格手势冲突
- 解决手势冲突问题
- IOS手势冲突
- iOS,scrollview手势冲突
- iOS手势冲突
- iOS手势冲突问题
- iOS 关于UITapGestureRecognizer 单击与双击手势冲突的解决
- iOS 解决tableView和点击手势冲突问题
- iOS端如何解决自定义滑动退出手势与TableViewCell删除手势之间的冲突问题
- TableView和手势冲突解决
- iOS手势以及手势冲突问题
- iOS 手势冲突的问题
- iOS手势相关添加
- Carthage 使用 / 如何给自己的项目添加 Carthage 支持
- POJ 2718 Smallest Difference
- 数据库面试题整理
- 如何进行搜索引擎优化内容审计
- BIRT参数设置详解
- iOS手势冲突相关解决
- 侧滑+ViewPager+Radiogroup
- Android:最全面的 Webview 详解
- sublime text 写程序build后提示can't find '__main__' module in ' '
- c#中的"\r\n"区别?
- 数据结构实验之栈与队列一:进制转换
- 历史上最详细的github注册到使用的图文教程
- iOS PassKit Wallet 开发(Passbook 开发)
- Django admin header 修改‘’Django 管理“