一、与webView进行交互,调用web页面中的需要传参的函数时,参数需要带单引号,或者双引号(双引号需要进行转义在转义字符前加\),在传递json字符串时不需要加单引号或双引号。


​1​

​-(​​​​void​​​​)webViewDidFinishLoad:(UIWebView *)webView​


​2​

​{​


​3​

​    ​​​​NSString *sendJsStr=[NSString stringWithFormat:@​​​​"openFile(\"%@\")"​​​​,jsDocPathStr];​


​4​

​  ​​​​[webView stringByEvaluatingJavaScriptFromString:sendJsStr];​


​5​

​}​


2、在该代理方法中判断与webView的交互,可通过html里定义的协议实现


​1​

​- (​​​​BOOL​​​​)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType​

3、只有在webView加载完毕之后在能够调用对应页面中的js方法。(对应方法如第一条)

 4、为webView添加背景图片


​1​

​approvalWebView.backgroundColor=[UIColor clearColor];​


​2​

​approvalWebView.opaque=NO;​​​​//这句话很重要,webView是否是不透明的,no为透明​


​3​

​//在webView下添加个imageView展示图片就可以了​


 5、获取webView页面内容信息


​1​

​NSString *docStr=[webView stringByEvaluatingJavaScriptFromString:@​​​​"document.documentElement.textContent"​​​​];​​​​//获取web页面内容信息,此处获取的是个json字符串​


​2​



​3​

​SBJsonParser *parserJson=[[[SBJsonParser alloc]init]autorelease];​


​4​



​5​

​NSDictionary *contentDic=[parserJson objectWithString:docStr];​​​​//将json字符串转化为字典​


 6、加载本地文件的方法


​1​

​第一种方法:​


​2​

​NSString* path = [[NSBundle mainBundle] pathForResource:name ofType:@​​​​"html"​​​​inDirectory:@​​​​"mobile"​​​​];​​​​//mobile是根目录,name是文件名称,html是文件类型​


​3​

​[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]]; ​​​​//加载本地文件​


​4​

​第二种方法:​


​5​

​NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; ​


​6​

​NSString *filePath = [resourcePath stringByAppendingPathComponent:@​​​​"mobile.html"​​​​]; ​


​7​

​NSString *htmlstring=[[NSString alloc] initWithContentsOfFile:filePath  encoding:NSUTF8StringEncoding error:nil]; ​


​8​

​[uiwebview loadHTMLString:htmlstring baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];​


 7、将文件下载到本地址然后再用webView打开


​01​

​NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@​​​​"Documents"​​​​]];​


​02​

​ ​​​​self.filePath = [resourceDocPath stringByAppendingPathComponent:[NSString stringWithFormat:@​​​​"maydoc%@"​​​​,docType]];​


​03​

​NSData *attachmentData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:theUrl]];​


​04​

​[attachmentData writeToFile:filePath atomically:YES];​


​05​

​ ​​​​NSURL *url = [NSURL fileURLWithPath:filePath];​


​06​

​ ​​​​NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];​


​07​

​ ​​​​[attachmentWebView loadRequest:requestObj];​


​08​

​//删除指定目录下的文件​


​09​



​10​

​NSFileManager *magngerDoc=[NSFileManager defaultManager];​


​11​

​[magngerDoc removeItemAtPath:filePath error:nil];​

8、处理webView展示txt文档乱码问题

​01​

​if​​​​([theType isEqualToString:@​​​​".txt"​​​​])​


​02​

​ ​​​​{​


​03​

​//txt分带编码和不带编码两种,带编码的如UTF-8格式txt,不带编码的如ANSI格式txt​


​04​

​//不带的,可以依次尝试GBK和GB18030编码​


​05​

​NSString* aStr = [[NSString alloc] initWithData:attachmentData encoding:NSUTF8StringEncoding];​


​06​

​if​​​​(!aStr)​


​07​

​{​


​08​

​//用GBK<strong>进行</strong>编码​


​09​

​aStr=[[NSString alloc] initWithData:attachmentData encoding:0x80000632];​


​10​

​}​


​11​

​if​​​​(!aStr)​


​12​

​{​


​13​

​//用GBK编码不行,再用GB18030编码​


​14​

​ ​​​​aStr=[[NSString alloc] initWithData:attachmentData encoding:0x80000631];​


​15​

​}​


​16​

​//通过html语言<strong>进行</strong>排版​


​17​

​ ​​​​NSString* responseStr = [NSString stringWithFormat:​


​18​

​                                 ​​​​@​​​​"<HTML>"​


​19​

​                                 ​​​​"<head>"​


​20​

​                                 ​​​​"<title>Text View</title>"​


​21​

​                                 ​​​​"</head>"​


​22​

​                                 ​​​​"<BODY>"​


​23​

​                                 ​​​​"<pre>"​


​24​

​                                 ​​​​"%@"​


​25​

​                                 ​​​​"/pre>"​


​26​

​                                 ​​​​"</BODY>"​


​27​

​                                 ​​​​"</HTML>"​​​​,​


​28​

​                                 ​​​​aStr];​


​29​

​ ​​​​[attachmentWebView loadHTMLString:responseStr baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];​


​30​

​        ​​​​return​​​​;​


​31​

​ ​​​​}​


 9 、使用webView加载本地或网络文件整个流程


​01​

​1、 Loading a local PDF file into the web view​


​02​



​03​

​- (​​​​void​​​​)viewDidLoad {​


​04​

​    ​​​​[super viewDidLoad];​


​05​

​ ​​​​//从本地加载​


​06​

​    ​​​​NSString *thePath = [[NSBundle mainBundle] pathForResource:@​​​​"iPhone_User_Guide"​​​​ofType:@​​​​"pdf"​​​​];​


​07​

​    ​​​​if​​​​(thePath) {​


​08​

​        ​​​​NSData *pdfData = [NSData dataWithContentsOfFile:thePath];​


​09​

​        ​​​​[(UIWebView *)self.view loadData:pdfData MIMEType:@​​​​"application/pdf"​


​10​

​            ​​​​textEncodingName:@​​​​"utf-8"​​​​baseURL:nil];​


​11​

​    ​​​​}​


​12​

​//从网络加载​


​13​

​[self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@​​​​"http://www.apple.com/"​​​​]]];​


​14​

​}​


​15​

​2、The web-view delegate managing network loading​


​16​



​17​

​- (​​​​void​​​​)webViewDidStartLoad:(UIWebView *)webView​


​18​

​{​


​19​

​    ​​​​// starting the load, show the activity indicator in the status bar​


​20​

​    ​​​​[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;​


​21​

​}​


​22​



​23​

​- (​​​​void​​​​)webViewDidFinishLoad:(UIWebView *)webView​


​24​

​{​


​25​

​    ​​​​// finished loading, hide the activity indicator in the status bar​


​26​

​    ​​​​[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;​


​27​

​}​


​28​



​29​

​- (​​​​void​​​​)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error​


​30​

​{​


​31​

​    ​​​​// load error, hide the activity indicator in the status bar​


​32​

​    ​​​​[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;​


​33​



​34​

​    ​​​​// report the error inside the webview​


​35​

​    ​​​​NSString* errorString = [NSString stringWithFormat:​


​36​

​                             ​​​​@​​​​"<html><center><font size=+5 color='red'>An error occurred:<br>%@</font></center></html>"​​​​,​


​37​

​                             ​​​​error.localizedDescription];​


​38​

​    ​​​​[self.myWebView loadHTMLString:errorString baseURL:nil];​


​39​

​}​


​40​

​3、Stopping a load request when the web view is to disappear​


​41​



​42​

​- (​​​​void​​​​)viewWillDisappear:(​​​​BOOL​​​​)animated​


​43​

​{​


​44​

​    ​​​​if​​​​( [self.myWebView loading] ) {​


​45​

​        ​​​​[self.myWebView stopLoading];​


​46​

​    ​​​​}​


​47​

​    ​​​​self.myWebView.delegate = nil;    ​​​​// disconnect the delegate as the webview is hidden​


​48​

​    ​​​​[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;​


​49​

​}​


​50​

​/************/​


​51​

​引用自苹果官方文档(displaying web content)​


10、查找webView中的scrollview


​01​

​- (​​​​void​​​​) addScrollViewListener​


​02​

​{​


​03​

​    ​​​​UIScrollView* currentScrollView;​


​04​

​    ​​​​for​​​​(UIView* subView in self.webView.subviews) {​


​05​

​        ​​​​if​​​​([subView isKindOfClass:[UIScrollView ​​​​class​​​​]]) {​


​06​

​            ​​​​currentScrollView = (UIScrollView*)subView;​


​07​

​            ​​​​currentScrollView.delegate = self;​


​08​

​        ​​​​}​


​09​

​    ​​​​}​


​10​

​}​


11、去掉webView的阴影,做成类似scrollView


​01​

​- (​​​​void​​​​)clearBackgroundWithColor:(UIColor*)color​


​02​

​{​


​03​

​  ​​​​// 去掉webview的阴影​


​04​

​  ​​​​self.backgroundColor = color;​


​05​

​  ​​​​for​​​​(UIView* subView in [self subviews])​


​06​

​  ​​​​{​


​07​

​    ​​​​if​​​​([subView isKindOfClass:[UIScrollView ​​​​class​​​​]]) {​


​08​

​      ​​​​for​​​​(UIView* shadowView in [subView subviews])​


​09​

​      ​​​​{​


​10​

​        ​​​​if​​​​([shadowView isKindOfClass:[UIImageView ​​​​class​​​​]]) {​


​11​

​          ​​​​[shadowView setHidden:YES];​


​12​

​        ​​​​}​


​13​

​      ​​​​}​


​14​

​    ​​​​}​


​15​

​  ​​​​}​


​16​



​17​

​}​


 12、取消长按webView上的链接弹出actionSheet的问题


​1​

​-(​​​​void​​​​)webViewDidFinishLoad:(UIWebView *)webView​


​2​

​{​


​3​

​ ​​​​[webView stringByEvaluatingJavaScriptFromString:@​​​​"document.documentElement.style.webkitTouchCallout = 'none';"​​​​];​


​4​

​}​

13、取消webView上的超级链接加载问题

​1​

​-(​​​​BOOL​​​​)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType​


​2​

​{​


​3​

​    ​​​​if​​​​(navigationType==UIWebViewNavigationTypeLinkClicked) {​


​4​

​        ​​​​return​​​​NO;​


​5​

​    ​​​​}​


​6​

​    ​​​​else​​​​{​


​7​

​        ​​​​return​​​​YES;​


​8​

​    ​​​​}​


​9​

​}​


14、一、webView在ios5.1之前的bug:在之前的工程中使用webView加载附件,webView支持doc,excel,ppt,pdf等格式,但这些附件必须先下载到本地然后在加载到webView上才可以显示, 当附件下载到本地之后刚刚开始加载到webView上时,此时退出附件页面会导致程序崩溃。会崩溃是由于webView控件内部没有把相关代理取消掉,所以导致退出之后程序崩溃。

二、webView在5.1上的bug:之前项目需求要webView可以左右活动,但在往webView上加载页面时导致页面加载不全,这个bug是由于webView本身的缓存所致。(还有待研究)

15、在使用webView进行新浪微博分享时,webView会自动保存登陆的cookie导致项目中的分享模块有些问题,删除 webView的cookie的方法


​01​

​-(​​​​void​​​​)deleteCookieForDominPathStr:(NSString *)thePath​


​02​

​{​


​03​

​    ​​​​//删除本地cookie,thePath为cookie路径通过打印cookie可知道其路径   ​


​04​

​    ​​​​for​​​​(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {​


​05​



​06​

​        ​​​​if​​​​([[cookie domain] isEqualToString:thePath]) {​


​07​



​08​

​            ​​​​[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];​


​09​

​        ​​​​}​


​10​

​    ​​​​}​


​11​

​}​


 16、在UIWebView中使用flashScrollIndicators

使用UIScrollView时,我们可以使用flashScrollIndicators方法显示滚动标识然后消失,告知用户此页面可以滚动,后面还有更多内容。UIWebView内部依赖于UIScrollView,但是其没有flashScrollIndicators方法,但可以通过其他途径使用此方法,如下所示。


​1​

​for​​​​(id subView in [webView subviews])​


​2​

​{   ​​​​if​​​​([subView respondsToSelector:@selector(flashScrollIndicators)])     ​


​3​

​     ​​​​{​


​4​

​       ​​​​[subView flashScrollIndicators];​


​5​

​     ​​​​}​


​6​

​}​

上述代码片段可以到webViewDidFinishLoad回调中使用,加载完网页内容后flash显示滚动标识。

17、根据内容获取UIWebView的高度

有时候需要根据不同的内容调整UIWebView的高度,以使UIWebView刚好装下所有内容,不用拖动,后面也不会留白。有两种方式可根据加载内容获取UIWebView的合适高度,但都需要在网页内容加载完成后才可以,即需要在webViewDidFinishLoad回调中使用。

①.使用sizeThatFits方法。


​1​

​- (​​​​void​​​​)webViewDidFinishLoad:(UIWebView *)webView​


​2​

​{    ​


​3​

​    ​​​​CGRect frame = webView.frame;   ​


​4​

​    ​​​​frame.size.height = 1;    ​


​5​

​    ​​​​webView.frame = frame;    ​


​6​

​    ​​​​CGSize fittingSize = [webView sizeThatFits:CGSizeZero];    ​


​7​

​    ​​​​frame.size = fittingSize;   ​


​8​

​    ​​​​webView.frame = frame;​


​9​

​}​

sizeThatFits方法有个问题,如果当前UIView的大小比刚好合适的大小还大,则返回当前的大小,不会返回最合适的大小值,所以使用sizeThatFits前,先将UIWebView的高度设为最小,即1,然后再使用sizeThatFits就会返回刚好合适的大小。 

②、使用JavaScript


​1​

​- (​​​​void​​​​)webViewDidFinishLoad:(UIWebView *)webView​


​2​

​{     CGRect frame = webView.frame;  ​


​3​

​      ​​​​NSString *fitHeight = [webview stringByEvaluatingJavaScriptFromString:@​​​​"document.body.scrollHeight;"​​​​];    ​


​4​

​     ​​​​frame.size.height = [fitHeight floatValue];   ​


​5​

​     ​​​​webView.frame = frame;​


​6​

​}​