响应链解决UIScrollView上添加UITableView导
2019-04-11 本文已影响0人
wg刚
先看效果:
使用:不需要改动你的代码逻辑,只需直接拖动WGTableViewInScrollView
文件到工程,用到的UIScrollView,继承自WGTableViewInScrollView即可。
解决方案:响应链
1、新建UIScrollView的子类,重写-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
方法。
2、判断point在屏幕的位置,如果是在屏幕右侧一定距离(100以内,自己可调),认为是UITableView的侧滑,这时就要禁止UIScrollView的滚动属性;反之允许UIScrollView的滚动。
于是,实现代码如下:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
UIView *resultView = [super hitTest:point withEvent:event];
if (resultView) {
/*
resultView为nil说明不再在view上,不作处理
不为nil,则进行下面处理
*/
if (resultView != self) {
/*
如果响应resultView不是UIScrollView,则根据用户滑动位置来确定
是self的子视图(tableView)侧滑
还是self本身(scrollView)滚动
*/
int count = (int)point.x / (int)([UIScreen mainScreen].bounds.size.width);
CGFloat res = point.x - ([UIScreen mainScreen].bounds.size.width)*count;
if (res > ([UIScreen mainScreen].bounds.size.width - 100)) {
//在屏幕右边缘(100以内,自己可根据情况修改)位置,则认为是tableView侧滑
self.scrollEnabled = NO;
//这里只是暂时设置self不可滑动,但是最佳响应这并没有改变
return resultView;
}else{
//在屏幕左侧或者中间位置,则认为是self滚动
self.scrollEnabled = YES;
return resultView;
}
}else{
//如果self是,则恢复滑动
self.scrollEnabled = YES;
return resultView;
}
}else{
return nil;
}
}