iOS WebView与ScrollView滑动交互

·  阅读 1494

WebView与ScrollView滑动交互

由于项目当中涉及webView与scrollView的滑动交互,一开始是通过计算webView的高度并且禁用webView的滑动,然后改变scrollView的contentSize去实现滑动操作,但这种做法当webView加载的内容里图片过多时会造成内存爆满,所以换了一种做法去实现。

# 效果如下:

Demo下载

image

代码处理

1、scrollView的处理

(1)首先需要创建一个响应多手势的LQScrollView类

响应多手势的方法

/**
 让ScrollView响应多手势
 */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    
    return YES;
}
复制代码
(2)在controller中创建一个继承于LQScrollView的scrollView,同时创建一个isCanScroll BOOL属性用于控制scrollView是否可以滑动
/** scrollView是否可滑动 */
@property (nonatomic, assign) BOOL isCanScroll;

/** scrollV */
@property (nonatomic, strong) LQScrollView *scrollV;
复制代码

2、webView的处理

(1)首先需要创建一个LQWebView类,由于webView中ScrollView的代理方法也是- (void)scrollViewDidScroll:(UIScrollView *)scrollView,所以为了更好的区分代理方法实现,在这个应该创建一个LQWebView用于控制滑动代理方法
(2)创建一个BOOL属性(isWebCanScroll)用于控制webView是否可以滑动
/** 是否可以滑动 */
@property (nonatomic, assign) BOOL isWebCanScroll;
复制代码
(3)处理webView中ScrollView的滑动代理

通过isWebCanScroll属性来控制是否可滑动,通用设置webView中ScrollView的contentOffset来实现webView不可滑动,当webView可滑动并且滑动到顶部的时候,此时改变webView的isWebCanScroll属性重新让webView不可滑,并且将这种状态用通知发送出去。

#pragma mark  UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    if (scrollView == self.scrollView) {
        CGFloat offY = scrollView.contentOffset.y;
//        NSLog(@"offY == %lf",offY);
        
        if (!self.isWebCanScroll) {   //通过设置 contentOffset 让webView不可滑动
            self.scrollView.contentOffset = CGPointZero;
        }
        if (offY < 0) {   //当webView滑动顶部时 使webView不可滑 并且将该状态用通知发送出去
            self.isWebCanScroll = NO;
            self.scrollView.contentOffset = CGPointZero;
            [[NSNotificationCenter defaultCenter] postNotificationName:@"WEBVIEWSCROLLTOTOP" object:nil];
        }
        
    }
    
}
复制代码

3、Controller中的处理

(1)处理ScrollView的代理
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    CGFloat offY = scrollView.contentOffset.y;
    
    if (scrollView == self.scrollV) {
        if (offY >= TopViewHeight) {  //此时webView到达顶部 让scrollView不可滑 让webView可滑
            self.scrollV.contentOffset = CGPointMake(0, TopViewHeight);
            if (self.isCanScroll) {
                self.isCanScroll = NO;
                self.webV.isWebCanScroll = YES;
            }
        }else if (offY >= 0 && offY < 200){ //scrollView处于可滑动范围
            if (self.isCanScroll) {
                self.scrollV.contentOffset = CGPointMake(0, offY);
            }else{
               if (self.webV.isWebCanScroll && self.webV.scrollView.contentOffset.y == 0) { //解决临界值问题
                    self.isCanScroll = YES;
                    self.webV.isWebCanScroll = NO;
                } else {
                    self.scrollV.contentOffset = CGPointMake(0, TopViewHeight);
                }
                
            }
        }
    }
    
    
}

复制代码
(2)处理通知事件
/**
 接收webView不可滑的通知 scrollView设置为可滑
 */
- (void)webViewScrollToTop:(NSNotification *)nofi{
     self.isCanScroll = YES;
}
复制代码

补充说明:

该处理方式不仅适用于webView与scrollView也适用于tableView于ScrollView的交互。处理方式是一样的,都是通过BOOL 属性去控制是否可滑动,而是否可滑动的处理是通过在ScrollView的代理方法scrollViewDidScroll去控制ScrollView的contentOffset实现的。

GitHub地址 :github.com/qiuyubude/G…

简书地址:www.jianshu.com/p/5ee0c074a…

分类:
iOS
标签:
分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改