iOS底层技术

响应链解决UIScrollView上添加UITableView导

2019-04-11  本文已影响0人  wg刚

先看效果:

demo

使用:不需要改动你的代码逻辑,只需直接拖动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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读