最近在寫百度地圖的時候發現地圖和scrollView和tableView的滑動手勢會沖突,這里以百度地圖作為示例寫一遍解決方法
首先遵循UIGestureRecognizerDelegate代理方法
然后在你需要禁止滑動的scrollView添加手勢
// 給第一個tableView添加手勢
UIGestureRecognizer *mainScrollVTap = [[UIGestureRecognizer alloc]init];
mainScrollVTap.delegate=self;
[scroAll addGestureRecognizer:mainScrollVTap];
// 給最底部的scrollview 添加手勢
UIGestureRecognizer *mainScrollVTap = [[UIGestureRecognizer alloc]init];
mainScrollVTap.delegate=self;
[scroAll addGestureRecognizer:mainScrollVTap];
在地圖上添加點擊手勢
_mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, PTTotalHeight/5*2)];
_mapView.userTrackingMode = BMKUserTrackingModeFollow;//設置定位的狀態
_mapView.delegate = self;
_mapView.showsUserLocation = YES;//顯示定位圖層
[scroRoute addSubview:_mapView];
//給地圖加手勢以解決滑動沖突
UITapGestureRecognizer *provinceMapTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(provinceMapTapped)];
provinceMapTap.delegate = self;
[_mapView addGestureRecognizer:provinceMapTap];
最后實現手勢代理方法判斷出需要觸發哪一個手勢
#pragma mark 手勢代理方法 ,判斷觸摸的是地圖還是外層的view
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
//判斷如果是百度地圖的view 既可以實現手勢拖動 scrollview 的滾動關閉
if ([gestureRecognizer.view isKindOfClass:[BMKMapView class]] ){
scroAll.scrollEnabled = NO;
scroRoute.scrollEnabled = NO;
return YES;
}else{
scroAll.scrollEnabled = YES;
scroRoute.scrollEnabled = YES;
return NO;
}
}
需要注意的一點是給地圖添加了點擊手勢需要實現方法,不然會崩潰
-(void)provinceMapTapped{
}
演示效果
示例.gif
順便整理一下如何判斷scrollView的滑動方向
聲明變量
@interface ViewController ()<UIScrollViewDelegate>
{
UIScrollView *scro;
float lastContentOffsetX;
float lastContentOffsetY;
}
在scrollViewWillBeginDragging方法里記錄開始前的X、Y值
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
lastContentOffsetY = scrollView.contentOffset.y;
lastContentOffsetX = scrollView.contentOffset.x;
}
在scrollViewDidScroll方法里判斷滑動方向
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
if(scrollView.contentOffset.y>lastContentOffsetY){
NSLog(@"向上滑動");
}else if(scrollView.contentOffset.y<lastContentOffsetY){
NSLog(@"向下滑動");
}
if(scrollView.contentOffset.x<lastContentOffsetX){
NSLog(@"向左滑動");
}else if(scrollView.contentOffset.x>lastContentOffsetX){
NSLog(@"向右滑動");
}
}