关于UIWebView的一些事(进度条私有实现)

、、

市面上的浏览器都做了进度条,但是资料找来找去都是私有API,有什么解决方案吗?能上架的私有调用方法有没有?请大神PM一个

进度条用了私有方法实现,上架成功,不知道是不是运气。这里就不公开了,卖个关子


转自:http://www.cocoachina.com/bbs/read.php?tid=123113

最近做了浏览器的项目,和UIWebView大了不少交道,所以专门开个帖子讲讲相关内容吧,想到什么就更新什么

基础篇:

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

网页执行js代码

复制代码

stringByEvaluatingJavaScriptFromString

这个方法是让一切成为可能的关键,有了这个方法,才能对网页进行各种操作。我自己没有做过网页开发,所以对js不熟悉,只用了一些最常用的js,如果非常熟悉的话应该能做更多的事。

从网页获取URL:

复制代码

- (NSURL*)url

{

NSString *urlString = [self stringByEvaluatingJavaScriptFromString:@"location.href"];

if (urlString) {

return [NSURL URLWithString:urlString];

} else {

return nil;

}

}

从网页获取标题:

复制代码

- (NSString*)title

{

return [self stringByEvaluatingJavaScriptFromString:@"document.title"];

}

网页的滚动位置:

复制代码

- (CGPoint)scrollOffset {

CGPoint pt;

pt.x = [[self stringByEvaluatingJavaScriptFromString:@"window.pageXOffset"] integerValue];

pt.y = [[self stringByEvaluatingJavaScriptFromString:@"window.pageYOffset"] integerValue];

return pt;

}

网站的图标Icon下载地址:

复制代码

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是否合法(自己写的,未经过大量验证):

复制代码

+(BOOL)isValidWebUrl:(NSURL *)url

{

BOOL valid = NO;

if (url) {

if (!url.scheme.length) {

url = [NSURL URLWithString:[@"http://" stringByAppendingString:url.absoluteString]];

}

if (url.host.length) {

NSString * regex        =  @"^([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?[    wind_phpcode_5    ]quot;;

NSPredicate * pred      = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

if ([pred evaluateWithObject:url.host]) {

valid = YES;

}

}

}

return valid;

}

判断url是否相同:

NSURL的isEqual方法不太好用。最常见的问题是http://www.google.comhttp://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,所以再补上下面的部分才行

复制代码

function MyIPhoneApp_isBlankInBaseElement() {    var baseElements = document.getElementsByTagName('base');

if(baseElements.length > 0){

if(baseElements[0].getAttribute('target') == '_blank'){

return 'yes';

}

}

return 'no';

}

清除UIWebVIew的内存占用和泄露:

http://www.codercowboy.com/code-uiwebview-memory-leak-prevention/

地址栏随着网页下拉移动,类似safari:

先拿到webView的scrollView,如果5.0以下就用靠循环去找了

复制代码

-(UIScrollView *)getWebScrollView{

UIScrollView* scroll = nil;

if ([self respondsToSelector:@selector(scrollView)]) {

scroll = [self scrollView];

}else{

for (UIView* view in [self subviews]) {

if ([view isKindOfClass:[UIScrollView class]]) {

scroll = (UIScrollView*)view;

break;

}

}

}

return scroll;

}

然后把设置delegate,实现scrollViewDidScroll方法

复制代码

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{

CGPoint contentOffset = scrollView.contentOffset;

CGFloat threshold = self.topBar.frame.size.height; // topBar就是webview上面的地址栏

if(contentOffset.y>=-threshold &&contentOffset.y<=480 )  // 480设置得有些大了,这里是为了防止快速滑动的时候回调会跟不上,

{

self.topBar.frame = CGRectMake(0,-threshold-contentOffset.y, 320, self.topBar.frame.size.height);

}

else if(contentOffset.y<-threshold){

self.topBar.frame = CGRectMake(0, 0, 320, self.topBar.frame.size.height);

}

}

停止和播放网页上的视频:

iPad上在网页里播放视频,即使关掉webView,依旧余音绕耳,调用下面的js可以停止播放

复制代码

function stopVideo(){    var videos = document.querySelectorAll("video");

for (var i = videos.length - 1; i >= 0; i--){

videos.pause();

};

return 'stop';

}

离线缓存网页:

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的时候就是一个网页加载完毕了。 不过别高兴太早,加载完毕不代表网页渲染完毕,所以在最后还需要做一个延时操作,以确保网页确实显示出来了。

好了,现在网页开始和网页结束都找到了,但中间过程仍然是个谜,只能不靠谱模拟了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容