關於UIWebView的一些事---轉載

來源:互聯網
上載者:User

標籤:blog   class   c   code   java   tar   

轉自:http://www.cocoachina.com/applenews/devnews/2013/0105/5473.html

 

最近做了瀏覽器的項目,和UIWebView大了不少交道,所以專門開個文章講講相關內容吧,想到什麼就更新什麼。         

基礎篇:

NSURL介紹 http://blog.csdn.net/ysy441088327/article/details/7416759

網頁執行js代碼

1  stringByEvaluatingJavaScriptFromString

這個方法是讓一切成為可能的關鍵,有了這個方法,才能對網頁進行各種操作。我自己沒有做過網頁開發,所以對js不熟悉,只用了一些最常用的js,如果非常熟悉的話應該能做更多的事。

從網頁擷取URL:

1    - (NSURL*)url
2    {
3        NSString *urlString = [self stringByEvaluatingJavaScriptFromString:@"location.href"];
4        if (urlString) {
5            return [NSURL URLWithString:urlString];
6        } else {
7            return nil;
8        }
9    }
從網頁擷取標題:1    - (NSString*)title
2    {
3        return [self stringByEvaluatingJavaScriptFromString:@"document.title"];
4    }
網頁的滾動位置:1    - (CGPoint)scrollOffset {
2        CGPoint pt;
3        pt.x = [[self stringByEvaluatingJavaScriptFromString:@"window.pageXOffset"] integerValue];
4        pt.y = [[self stringByEvaluatingJavaScriptFromString:@"window.pageYOffset"] integerValue];
5        return pt;
6    }
網站的表徵圖Icon:1  NSURL *url = [[NSURL alloc] initWithScheme:[web.request.URL scheme] host:[web.request.URL host] path:@"/favicon.ico"];
調整webView裡的字型大小
http://www.cocoachina.com/bbs/read.php?tid=29707

判斷網頁URL是否合法(自己寫的,未經過大量驗證):1    +(BOOL)isValidWebUrl:(NSURL *)url
2    {
3        BOOL valid = NO;
4
5       if (url) {
6          if (!url.scheme.length) {
7               url = [NSURL URLWithString:[@"http://" stringByAppendingString:url.absoluteString]];
8           }
9         if (url.host.length) {
10  NSString * regex        =  @"^([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?[    wind_phpcode_5    ]quot;; 
11               NSPredicate * pred      = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
12               if ([pred evaluateWithObject:url.host]) {
13                  valid = YES;
14             }
15          }
16      }
17       return valid;
18   }

判斷url是否相同:NSURL的isEqual方法不太好用。最常見的問題是http://www.google.com和http://www.google.com/會判斷不同,原因是蘋果在這裡沒有遵循RFC2616規則做網址對比,所以最好自己判斷下最後的斜杠

載入本地html的css和圖片:
基本上就是載入本地檔案的url就可以了,但如果是有外部的css和圖片等資源,記得拖資源的時候記得要選擇下面的create folder references for any added folder,不要選group,這樣才能獲得正確的路徑關係。

提高篇:

這裡直接引用一個國外部落格,先放著,日後再翻譯

自訂網頁上的長按快顯功能表:
http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/

網頁內關鍵字搜尋與高亮:
http://www.icab.de/blog/2010/01/12/search-and-highlight-text-in-uiwebview/

自動根據網頁開啟新標籤和新視窗:
http://www.icab.de/blog/2009/07/27/webkit-on-the-iphone-part-1/
http://www.icab.de/blog/2009/08/05/webkit-on-the-iphone-part-2/
只是上面2個還不夠,有些網頁的_blank不是寫在連結上的,而是全域都是_blank,所以再補上下面的部分才行1   function MyIPhoneApp_isBlankInBaseElement() {    var baseElements = document.getElementsByTagName(‘base‘);
2      if(baseElements.length > 0){
3          if(baseElements[0].getAttribute(‘target‘) == ‘_blank‘){
4              return ‘yes‘;
5          }
6      }
7      return ‘no‘;
8  } 清除UIWebVIew的記憶體佔用和泄露:
http://www.codercowboy.com/code-uiwebview-memory-leak-prevention/

地址欄隨著網頁下拉移動,類似safari:
先拿到webView的scrollView,如果5.0以下就用靠迴圈去找了1    -(UIScrollView *)getWebScrollView{
2        UIScrollView* scroll = nil;
3
4
5        if ([self respondsToSelector:@selector(scrollView)]) {
6            scroll = [self scrollView];
7        }else{
8            for (UIView* view in [self subviews]) {
9                if ([view isKindOfClass:[UIScrollView class]]) {
10                    scroll = (UIScrollView*)view;
11                    break;
12               }
13            }
14        }
15        return scroll;
16    }
然後把設定delegate,實現scrollViewDidScroll方法1    -(void)scrollViewDidScroll:(UIScrollView *)scrollView{
2
3
4        CGPoint contentOffset = scrollView.contentOffset;
5
6        CGFloat threshold = self.topBar.frame.size.height; // topBar就是webview上面的地址欄
7
8        if(contentOffset.y>=-threshold &&contentOffset.y<=480 )  // 480設定得有些大了,這裡是為了防止快速滑動的時候回調會跟不上,
9        {
10            self.topBar.frame = CGRectMake(0,-threshold-contentOffset.y, 320, self.topBar.frame.size.height);
11        }
12        else if(contentOffset.y<-threshold){
13            self.topBar.frame = CGRectMake(0, 0, 320, self.topBar.frame.size.height);
14        }
15    }
停止和播放網頁上的視頻:
iPad上在網頁裡播放視頻,即使關掉webView,依舊餘音繞耳,調用下面的js可以停止播放1    function stopVideo(){    var videos = document.querySelectorAll("video");
2        for (var i = videos.length - 1; i >= 0; i--){
3            videos.pause();
4        };
5        return ‘stop‘;
6    }

離線緩衝網頁:
http://re-reference.iteye.com/blog/1391408

網頁載入進度不靠譜類比:

一般情況下,載入一個網頁會經曆should->start->finish3個階段。仔細看UIWebViewDelegate的文檔,會發現這裡的delegate針對的是每個frame,也就是說如果網頁由多個frame組成的話會有多個start。那麼這裡的finish也會被調用多次,所以僅靠finish是無法判斷網頁是否載入完全的。

事實是,載入任意網頁,srart和finish/fail是配對的,也就是說有多少個start就有多少個finish/fail。所以在start做count++,finish/fail做count- -,為0的時候就是一個網頁載入完畢了。 不過別高興太早,載入完畢不代表網頁渲染完畢,所以在最後還需要做一個延時操作,以確保網頁確實顯示出來了。

好了,現在網頁開始和網頁結束都找到了,但中間過程仍然是個謎,只能不靠譜類比了。
 

原帖地址:http://www.cocoachina.com/bbs/read.php?tid=123113

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.