首页 > 代码库 > 关于UIWebView的一些事---转载
关于UIWebView的一些事---转载
转自: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 }
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 }
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 }
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 }
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/
加载本地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 }
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以下就用靠循环去找了
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 }
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 }
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 }
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个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。