iOS WebView與ScrollView滑動交互

WebView與ScrollView滑動交互

因爲項目當中涉及webView與scrollView的滑動交互,一開始是經過計算webView的高度而且禁用webView的滑動,而後改變scrollView的contentSize去實現滑動操做,但這種作法當webView加載的內容裏圖片過多時會形成內存爆滿,因此換了一種作法去實現。git

# 效果以下:

Demo下載github

image

代碼處理

一、scrollView的處理

(1)首先須要建立一個響應多手勢的LQScrollView類

響應多手勢的方法web

/**
 讓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;
複製代碼

二、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不可滑,而且將這種狀態用通知發送出去。bash

#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];
        }
        
    }
    
}
複製代碼

三、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;
}
複製代碼

補充說明:post

該處理方式不只適用於webView與scrollView也適用於tableView於ScrollView的交互。處理方式是同樣的,都是經過BOOL 屬性去控制是否可滑動,而是否可滑動的處理是經過在ScrollView的代理方法scrollViewDidScroll去控制ScrollView的contentOffset實現的。ui

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

簡書地址:www.jianshu.com/p/5ee0c074a…spa

相關文章
相關標籤/搜索