WebView的優(yōu)缺點:
優(yōu)點:(1)跨平臺(2)發(fā)布更新快(3)排版布局能力強
缺點:(1)性能差(2)數(shù)據(jù)通訊復(fù)雜(3)耗費流量
使用場景:(1)排版復(fù)雜的內(nèi)容(2)需后臺靈活控制的界面
一父能、初始化與三種加載方式
UIWebView繼承于UIView贴捡,因此多艇,其初始化方法和一般的view一樣口猜,通過alloc和init進(jìn)行初始化,其加載數(shù)據(jù)的方式有三種:
1.第一種:
- (void)loadRequest:(NSURLRequest *)request;
這是加載網(wǎng)頁最常用的一種方式,通過一個網(wǎng)頁URL來進(jìn)行加載,這個URL可以是遠(yuǎn)程的也可以是本地的,例如加載百度的主頁
UIWebView * view = [[UIWebView alloc]initWithFrame:self.view.frame];
[view loadRequest:[NSURLRequestrequestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:view];
2.第二種:
- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;
這個方法需要將html文件讀取為字符串确垫,其中baseURL是我們自己設(shè)置的一個路徑,用于尋找html文件中引用的圖片等素材帽芽。
3.第三種:
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;
這個方式使用的比較少删掀,但也更加自由,其中data是文件數(shù)據(jù)嚣镜,MIMEType是文件類型爬迟,textEncodingName是編碼類型,baseURL是素材資源路徑菊匿。
二付呕、常用屬性和方法
屬性:
1.設(shè)置webView的代理
@property (nonatomic, assign) id <UIWebViewDelegate> delegate;
2.內(nèi)置的scrollView
@property (nonatomic, readonly, retain) UIScrollView *scrollView;
3.獲取URL請求
@property (nonatomic, readonly, retain) NSURLRequest *request;
4.獲取能否返回上一級
@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;
5.獲取能否跳轉(zhuǎn)下一級
@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;
6.獲取是否正在加載數(shù)據(jù)
@property (nonatomic, readonly, getter=isLoading) BOOL loading;
7.設(shè)置是否縮放到適合屏幕大小
UIWebView可以縮放HTML頁面來適配其視口大小计福,從而達(dá)到整屏顯示內(nèi)容的效果,并且用戶可以用捏合動作來放大或縮小頁面來查看內(nèi)容徽职。
默認(rèn)情況下UIWebView加載HTML頁面后象颖,會以頁面的原始大小進(jìn)行顯示,亦即如果頁面的大小超出UIWebView視口大小姆钉,UIWebView會出現(xiàn)滾動效果说订,而且用戶只能通過滾動頁面來查看不同區(qū)域的內(nèi)容,不能使用手指的捏合手勢來放大或縮小頁面潮瓶。
@property (nonatomic) BOOL scalesPageToFit;
例如:webView.scalesPageToFit = YES;
8.設(shè)置某些數(shù)據(jù)變?yōu)殒溄有问教绽洌@個枚舉可以設(shè)置如電話號,地址毯辅,郵箱等轉(zhuǎn)化為鏈接
@property (nonatomic) UIDataDetectorTypes dataDetectorTypes;
9.設(shè)置是否使用內(nèi)聯(lián)播放器播放視頻
@property (nonatomic) BOOL allowsInlineMediaPlayback;
10.設(shè)置視頻是否自動播放
@property (nonatomic) BOOL mediaPlaybackRequiresUserAction;
11.設(shè)置音頻播放是否支持ari play功能
@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay;
12.設(shè)置是否將數(shù)據(jù)加載如內(nèi)存后渲染界面
@property (nonatomic) BOOL suppressesIncrementalRendering;
13.設(shè)置用戶交互模式
@property (nonatomic) BOOL keyboardDisplayRequiresUserAction;
下面這些屬性是iOS7之后才有的埂伦,通過他們可以設(shè)置更加有趣的web體驗
14.這個屬性用來設(shè)置一種模式,當(dāng)網(wǎng)頁的大小超出view時思恐,將網(wǎng)頁以翻頁的效果展示
@property (nonatomic) UIWebPaginationMode paginationMode;
UIWebPaginationMode 枚舉:
UIWebPaginationModeUnpaginated //不使用翻頁效果
UIWebPaginationModeLeftToRight //將網(wǎng)頁超出部分分頁沾谜,從左向右進(jìn)行翻頁
UIWebPaginationModeTopToBottom //將網(wǎng)頁超出部分分頁,從上向下進(jìn)行翻頁
UIWebPaginationModeBottomToTop //將網(wǎng)頁超出部分分頁胀莹,從下向上進(jìn)行翻頁
UIWebPaginationModeRightToLeft //將網(wǎng)頁超出部分分頁基跑,從右向左進(jìn)行翻頁
15.設(shè)置每一頁的長度
@property (nonatomic) CGFloat pageLength;
16.設(shè)置每一頁的間距
@property (nonatomic) CGFloat gapBetweenPages;
17.獲取分頁數(shù)
@property (nonatomic, readonly) NSUInteger pageCount;
18.禁用頁面滾動彈跳
webView.scrollView.bounces = NO;
方法:
1.重新加載數(shù)據(jù)
- (void)reload;
2.停止加載數(shù)據(jù)
- (void)stopLoading;
3.返回上一級
- (void)goBack;
4.跳轉(zhuǎn)下一級
- (void)goForward;
5.通過javaScript操作web數(shù)據(jù),一般在webViewDidFinishLoad代理方法中描焰,在OC中執(zhí)行JS代碼的橋梁
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString*)script;
返回值:執(zhí)行完JS獲取返回的東西媳否,舉例如下:
(1)JS在執(zhí)行完一段代碼之后會將最后一個變量值返回給我們,代碼如下 :
NSString *js = @"var dog = {name : 'teddy', age : 20};dog.name; dog.age;";
NSString *result = [webView stringByEvaluatingJavaScriptFromString:js];
NSLog(@"%@",result); // 結(jié)果 : 20 字符串類型
(2)當(dāng)我們調(diào)完JS某個函數(shù)的時候,我們可以拿到這個函數(shù)的返回值,代碼如下 :
NSString *js = @"function login (username, pwd) { return 10;} login();";
NSString *result = [webView stringByEvaluatingJavaScriptFromString:js];
NSLog(@"%@",result); // 結(jié)果 : 10 函數(shù)的返回值
(3)如何獲取網(wǎng)頁的所有源代碼, 實現(xiàn)代碼如下 :
NSString *js = @"document.getElementsByTagName('html')[0].outerHTML";
NSString *result = [webView stringByEvaluatingJavaScriptFromString:js];
NSLog(@"%@",result); // 輸出結(jié)果為網(wǎng)頁所有的源代碼
補充 : document.body.innerHTML 意思是獲取body內(nèi)容的所有源代碼
JS代碼在OC中的排版
第一種做法:
NSMutableString *js = [NSMutableString string];
[js appendString:@"function login (username, pwd) {"];
[js appendString:@" return 10;"];
[js appendString:@" ]"];
[js appendString:@" login();"];
第二種做法:
NSString *js = @"function login (username, pwd) { "
" return 10;"
" }"
" login();";
三、代理方法 UIWebViewDelegate
1.每當(dāng)webView發(fā)送一個請求之前都會先調(diào)用這個方法栈顷,監(jiān)聽準(zhǔn)備加載內(nèi)容時調(diào)用逆日,通過判斷請求等參數(shù)來返回不同返回值判斷是否加載該網(wǎng)頁,是JS中執(zhí)行OC代碼的橋梁
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
參數(shù):
(1)request:即將發(fā)送的請求
(2)UIWebViewNavigationType 枚舉:
UIWebViewNavigationTypeLinkClicked 用戶觸擊了一個鏈接
UIWebViewNavigationTypeFormSubmitted 用戶提交了一個表單
UIWebViewNavigationTypeBackForward 用戶觸擊前進(jìn)或返回按鈕
UIWebViewNavigationTypeReload 用戶觸擊重新加載的按鈕
UIWebViewNavigationTypeFormResubmitted 用戶重復(fù)提交表單
UIWebViewNavigationTypeOther 發(fā)生其它行為
返回值:Yes允許發(fā)送這個請求萄凤,No禁止發(fā)送這個請求
例子:查看該案例發(fā)送和代理攔截請求(稍后整理,比較重要)
拼接HTML網(wǎng)頁方法顯示在WebView上
2.開始加載時調(diào)用的方法
- (void)webViewDidStartLoad:(UIWebView *)webView;
3.網(wǎng)頁加載完畢執(zhí)行的方法搪哪,一般在里面執(zhí)行JS代碼(刪除一些節(jié)點)靡努,相當(dāng)于網(wǎng)頁JS的window.onload屬性
- (void)webViewDidFinishLoad:(UIWebView *)webView;
例子:
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *js = @"document.getElementsByTagName('footer')[0].remove();";
[webView stringByEvaluatingJavaScriptFromString:js];}
補充:用JS刪除,瀏覽器的console中調(diào)試
(1)按標(biāo)簽名刪除
(2)按類刪除
4.加載失敗時調(diào)用的方法
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
四晓折、其它案例:
- 在Safari中打開鏈接地址
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if ( navigationType == UIWebViewNavigationTypeLinkClicked ) {
[[UIApplication sharedApplication] openURL:[request URL]];
return NO;
}
return YES;
}
2.讓UIWebView更加接近native(原生)
某些情況下惑朦,我們既想要UIWebView加載web頁面,又想使得所加載的頁面的外觀和操作行為更加接近native感覺漓概。這時需要使用一些CSS樣式來達(dá)到這些效果漾月,這些CSS只適用于IOS中的Safari。
-
- -webkit-touch-callout
禁用長按觸控對象彈出的菜單胃珍。IOS中梁肿,當(dāng)你長按一個觸控對象時蜓陌,如鏈接,safari會彈出包含鏈接信息的菜單吩蔑。禁用此行為CSS代碼
.disable-callout{
-webkit-touch-callout:none ;
}
或在webViewDidFinisheLoad中使用
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
-
- -webkit-user-select
控制用戶是否可以選擇頁面元素內(nèi)容钮热。IOS中,在頁面元素中進(jìn)行長按操作烛芬,safari會彈出菜單隧期,來允許進(jìn)行選擇行為。禁用此行為代碼
.disable-select{
-webkit-user-select:none;
}
或在webViewDidFinisheLoad中使用
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
-
- -webkit-tap-highlight-color
覆蓋當(dāng)用戶tap鏈接或clickable元素時默認(rèn)產(chǎn)生的高亮顏色(灰色)赘娄。如
.no-highlight{
-webkit-tap-highlight-color:rgba(0,0,0,0);
}