1.為什么要跳轉網頁?
點擊UICollectionView的cell我們發現跳轉到了網頁
2.在以后開發中,怎么判斷一個界面是不是網頁?
2.1根據服務器返回的數據 如果是網頁 會有網頁的url
2.2根據界面的一些圖標,或者是根據響應速度,如果是自己設計的界面跳轉會很流暢很快
3.怎么跳轉到網頁
3.1 openURL
openURl(safari) 好處:有很多功能(前進,后退,刷新,進度條,地址欄) 弊端:必須要離開當前app
3.2 UIWebView 好處:當前app展示網頁 弊端:沒有功能
3.3 WKWebView:UIVebView的升級版 ios8
優點: "1)性能提升:將瀏覽器內核渲染進程提取出 App,由系統進行統一管理,這減少了相當一部分的性能損失。
"2)允許JavaScript的Nitro庫加載并使用(UIWebView中限制)
"3)支持了更多的HTML5特性
"4)高達60fps的滾動刷新率
"5)提供了內置手勢探測
"6)可以監聽網頁加載進度
弊端:沒有功能
目前在7.3版本的XCode控件庫中還找不到WKWebView控件,也就是說如果想要使用該控件,則只能通過代碼的方式來創建。
需要包含WebKit框架
3.4 iOS9:SFSafariViewController(展示網頁),在當前app展示網頁,并且有safari所有功能
缺點: 必須要導入SafariServices/SafariServices.h 只有ios9或ios9以上的用戶才能用
3.4.1基本使用:
> XTSquareItem *item = _squares[indexPath.row];
判斷是否是url不是就返回
if (![item.url containsString:@"http"]) return;
NSURL *url = [NSURL URLWithString:item.url];
SFSafariViewController *safariVc = [[SFSafariViewController alloc] initWithURL:url];
[self.navigationController pushViewController:safariVc animated:YES];
3.4.2跳轉過去后發現地址欄被導航條擋住了 怎么解決?
隱藏該導航控制器下的所有導航條 寫在點擊cell的時候調用的代理方法里面
> self.navigationController.navigationBarHidden = YES;
3.4.3還發現我們不能返回了,左上角有一個done按鈕, 怎么返回?
我們去SFSafariViewController頭文件去搜索done 看有沒有方法監聽這個按鈕的點擊 我們發現下面這個代理方法
還發現敲代理方法的時候,說明done這個會dismiss掉Safari view 那么SFSafariViewController應該是modal出來的
#pragma mark - SFSafariViewControllerDelegate
- (void)safariViewControllerDidFinish:(SFSafariViewController *)controller
{
[self.navigationController popViewControllerAnimated:YES];
self.navigationController.navigationBarHidden = NO; 顯示導航條
}
3.4.4跳轉之后返回 發現本界面也沒有導航條了 怎么解決?
在上面的代理方法里面把隱藏導航條取消
3.4.5把 SFSafariViewController modal出來 我們就可以點擊done 不設置代理 返回嗎?
驗證我們的猜測是對的
> [self presentViewController:safariVc animated:YES completion:nil];
.
4.需求:必須在當前app展示網頁,但是也想要有safari功能(自己實現),UIWebView實現不了進度條功能
4.1 一般情況下我們看到的UIWebView的進度條都是假象
4.2 WKWebView 和 UIWebView 的使用基本上是一樣的
4.3 我們使用 WKWebView來實現
5.用WKWebView怎么實現點擊cell跳轉到網頁
5.1 根據項目需求,跳轉后的界面 由三部分組成
1.網頁界面用WKWebView搭建 (要先設置占位視圖,然后把WKWebView添加到展位視圖里面,避免擋住底部工具條)
2. 底部的工具條 用 Toolbar 控件搭建 里面的 按鈕用UIBarButtonItem搭建
注意:按鈕之間的間距我們要用一個Flexible Space(彈簧)來彈開
3.上面的地址欄 我們就用導航條來替換
4.界面固定,可以用xib來描述
5.創建一個控制器來管理xib的業務邏輯
5.2 怎么實現點擊cell跳轉網頁?
點擊cell的時候,把WKWebView所在的控制器push出來就可以了
注意:
5.3 WKWebView的基本使用
1 創建WKWebView對象
2 加載網頁
> // 創建WebView
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
// 加載網頁
NSURLRequest *request = [NSURLRequest requestWithURL:_url];
[webView loadRequest:request];
- 前進 后退 刷新 進度條 功能實現 怎么實現?
去WKWebView頭文件里找相關的屬性和方法(搜索相關方法或屬性名)
找到一些可用的方法和屬性,而且還看到關于屬性的用法 用kvo實現
@property (nullable, nonatomic, readonly, copy) NSString *title;
@property (nullable, nonatomic, readonly, copy) NSURL *URL;
@property (nonatomic, readonly) double estimatedProgress;
@property (nonatomic, readonly) BOOL canGoBack;
@property (nonatomic, readonly) BOOL canGoForward;
- (nullable WKNavigation *)goBack;
- (nullable WKNavigation *)goForward;
- (nullable WKNavigation *)reload;
4.kvo怎么使用?有哪些注意點?
給需要監聽的屬性添加觀察者,然后實現代理方法就可以了
KVO作用:監聽屬性改變
Observer:觀察者
KeyPath:屬性
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options
context:(nullable void *)context;
KVO使用注意點:當對象銷毀的時候,一定要記得移除觀察者
5.代理方法是什么? 怎么找?
找到kvo的方法(上面的那個方法),看一下蘋果的介紹,里面有說明怎么用
查看說明的方法就是 點擊一下方法 再按住option 會出現一個?號 點擊就可以查看 里面有需要實現的代理方法