美文网首页iOS底层技术
响应链解决UIScrollView上添加UITableView导

响应链解决UIScrollView上添加UITableView导

作者: wg刚 | 来源:发表于2019-04-11 11:02 被阅读0次

    先看效果:

    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;
        }
    }
    

    相关文章

      网友评论

        本文标题:响应链解决UIScrollView上添加UITableView导

        本文链接:https://www.haomeiwen.com/subject/dniziqtx.html