WKWebView的小使用

WKWebView.14年就出來了.用的少.并不是很熟練.聽說性能比UIWebView好很多.將內核啥的集成了..就是牛X了
直接談使用吧.

@property (nonatomic, strong) WKWebView *webView; @property (nonatomic, strong) UIProgressView *progressView;

self.webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height - 46)]; self.webView.navigationDelegate = self; self.webView.UIDelegate = self; [self.webView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; [self.webView setMultipleTouchEnabled:YES]; [self.webView setAutoresizesSubviews:YES]; [self.webView.scrollView setAlwaysBounceVertical:YES]; self.webView.scrollView.delegate = self;//監(jiān)聽偏移值. [self.webView.scrollView addSubview:self.indicatorView];//自己寫的 [self.webView.scrollView setContentOffset:CGPointMake(0, 100)]; [self.webView setAllowsBackForwardNavigationGestures:true];//側滑返回webView的上一級

就是這么實在. 可以直接拷貝使用

幾個代理方法.
頁面開始加載的時候調用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{}

當內容開始返回時調用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation { //這里處理返回按鈕.默.然后根據webView加載情況判斷是否顯示或隱藏. self.backButton.hidden = !webView.canGoBack; }
// 頁面加載完成之后調用-->比較多的處理在這里操作.
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { [self reloadView]; [self.webView.scrollView setContentOffset:CGPointMake(0, 0)]; if ( self.isLoad == YES) { [self hideHUD]; } }
// 頁面加載失敗時調用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation { [self hideHUD]; }

添加觀察者.監(jiān)聽title.加載進度.還有一個下拉偏移值(這個是做刷新準備的.也可以使用self.webView.scrollView的偏移代理做.本來這個不需要的.如果有網的情況.是會自動加載出來的.項目經理說有時候刷不出來了,那就按照他的意思,加一個刷新效果.下面介紹思路)

[self.webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];`

[self.webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];`

[self.webView.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew  context:nil];`

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"estimatedProgress"]) {//監(jiān)聽進度 if (object == self.webView) { [self.progressView setAlpha:1.0f]; [self.progressView setProgress:self.webView.estimatedProgress animated:YES]; if(self.webView.estimatedProgress >= 1.0f) { [UIView animateWithDuration:0.3 delay:0.3 options:UIViewAnimationOptionCurveEaseOut animations:^{ [self.progressView setAlpha:0.0f]; } completion:^(BOOL finished) { [self.progressView setProgress:0.0f animated:NO]; }]; } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } else if ([keyPath isEqualToString:@"title"])//監(jiān)聽標題 { if (object == self.webView) { if ([self.webView.title fq_IsEqualToString:@"綜合"]|| [self.webView.title fq_IsEqualToString:@"活動"]|| [self.webView.title fq_IsEqualToString:@"產品"]|| [self.webView.title fq_IsEqualToString:@"博客"]) { self.title = GETLANGUAGES(self.webView.title, nil); }else{ self.title = self.webView.title; } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } else if(object == self.webView.scrollView && [keyPath isEqualToString:@"contentOffset"]){//監(jiān)聽偏移值.我是為了做刷新處理. CGPoint offset = [change[@"new"] CGPointValue]; self.indicatorView.progress = fabs(offset.y) / 100.0; if (!fabs(offset.y)) { [self.indicatorView stopAnimation]; } if (-offset.y >= 100) { self.webBackView.frame = CGRectMake(0,0, self.view.bounds.size.width, 100); self.webBackView.alpha = 1.0f; } }else{ [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } }

目前沒有什么js與oc交互.因為全部是url跳轉的.所以我的做法是攔截url.然后做有網沒網提示.或者對應的跳轉處理.
-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{}

這里說一下給webView刷新界面的思路:
1.首先創(chuàng)建一個View.添加到self.view上面.
2.然后當webView下拉到一定層度的時候.我們根據contentOffset的y值來判斷是否需要刷新了.前面有監(jiān)聽到偏移值contentOffset
3.比較難實現(xiàn)的就是.下拉讓其停頓2s以后,再讓webView自動還原到原來的位置,如果還是在觀察者里面去更改webView的contentOffset這樣就會循環(huán)引用
4.我的解決方法是在scrollView的代理里面做一個判斷和操作.讓整個webview向下偏移.然后讓我們添加在self.view上面的視圖顯示.并且在上面添加一個動畫效果.菊花什么.也可以是文字"正在加載系列",刷新界面就很簡單了.重新加載url即可.
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ //如果scrollView的一個值達到多少. self.indicatorView.alpha = 1.0f; if((scrollView.contentOffset.y > 0) && self.webView.frame.origin.y != 0){ self.webBackView.alpha= 0.0f; self.webView.frame = CGRectMake(0, 100-scrollView.contentOffset.y, screen_width,self.view.bounds.size.height - 46); [self.webView.scrollView setContentOffset:CGPointMake(0,scrollView.contentOffset.y)]; } }

這個是為了防止部分網頁可以縮放的處理
-(void)scrollViewDidZoom:(UIScrollView *)scrollView { self.webBackView.alpha = 0.0f; }

主要是這個方法
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ if (-scrollView.contentOffset.y >= 100) { self.indicatorView.alpha = 0.0f; [UIView animateWithDuration:0.5 animations:^{ self.webView.frame = CGRectMake(0, 100, screen_width,self.view.bounds.size.height - 46); }completion:^(BOOL finished) { self.webBackView.frame = CGRectMake(0, 0, screen_width, 100); [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.urlStr]]]; }]; //兩秒鐘以后.執(zhí)行另一個方法.讓他還遠 [self performSelector:@selector(reloadView) withObject:nil afterDelay:2.0]; }else{ } }

開始下拉效果.png

下拉結束結束.png

其實就是兩層view.一個添加在webView的scrollView上面.讓其layer偏移到其上面.跟隨一起移動即可,
另外一個View添加在self.view上面

如果有什么更好的方式給webView刷新界面.可以共同學習.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末姆怪,一起剝皮案震驚了整個濱河市谭梗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聊训,老刑警劉巖绿饵,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灿里,死亡現(xiàn)場離奇詭異凿叠,居然都是意外死亡,警方通過查閱死者的電腦和手機昆淡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門锰瘸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昂灵,你說我怎么就攤上這事避凝。” “怎么了眨补?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵管削,是天一觀的道長。 經常有香客問我撑螺,道長含思,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任甘晤,我火速辦了婚禮含潘,結果婚禮上,老公的妹妹穿的比我還像新娘线婚。我一直安慰自己遏弱,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布塞弊。 她就那樣靜靜地躺著漱逸,像睡著了一般泪姨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饰抒,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天肮砾,我揣著相機與錄音,去河邊找鬼循集。 笑死唇敞,一個胖子當著我的面吹牛蔗草,可吹牛的內容都是我干的咒彤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咒精,長吁一口氣:“原來是場噩夢啊……” “哼镶柱!你這毒婦竟也來了?” 一聲冷哼從身側響起模叙,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤歇拆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后范咨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體故觅,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年渠啊,在試婚紗的時候發(fā)現(xiàn)自己被綠了输吏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡替蛉,死狀恐怖贯溅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情躲查,我是刑警寧澤它浅,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站镣煮,受9級特大地震影響姐霍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜典唇,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一镊折、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚓聘,春花似錦腌乡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侣签。三九已至,卻和暖如春急迂,著一層夾襖步出監(jiān)牢的瞬間影所,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工僚碎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猴娩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓勺阐,卻偏偏與公主長得像卷中,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渊抽,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容