赞
踩
一、初始化与三种加载方式
UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种:
第一种:
- (void)loadRequest:(NSURLRequest *)request;
这是加载网页最常用的一种方式,通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的,例如我加载百度的主页:
UIWebView * view = [[UIWebView alloc]initWithFrame:self.view.frame];
[view loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:view];
第二种:
- (void)loadHTMLString:(NSString )string baseURL:(NSURL )baseURL;
这个方法需要将httml文件读取为字符串,其中baseURL是我们自己设置的一个路径,用于寻找html文件中引用的图片等素材。
第三种:
- (void)loadData:(NSData )data MIMEType:(NSString )MIMEType textEncodingName:(NSString )textEncodingName baseURL:(NSURL )baseURL;
这个方式使用的比较少,但也更加自由,其中data是文件数据,MIMEType是文件类型,textEncodingName是编码类型,baseURL是素材资源路径。
二、一些常用的属性和变量
@property (nonatomic, assign) id delegate;
设置webView的代理
@property (nonatomic, readonly, retain) UIScrollView *scrollView;
内置的scrollView
@property (nonatomic, readonly, retain) NSURLRequest *request;
URL请求
(void)reload;
重新加载数据
(void)stopLoading;
停止加载数据
(void)goBack;
返回上一级
(void)goForward;
跳转下一级
@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;
获取能否返回上一级
@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;
获取能否跳转下一级
@property (nonatomic, readonly, getter=isLoading) BOOL loading;
获取是否正在加载数据
@property (nonatomic) BOOL scalesPageToFit;
设置是否缩放到适合屏幕大小
@property (nonatomic) UIDataDetectorTypes dataDetectorTypes NS_AVAILABLE_IOS(3_0);
设置某些数据变为链接形式,这个枚举可以设置如电话号,地址,邮箱等转化为链接
@property (nonatomic) BOOL allowsInlineMediaPlayback NS_AVAILABLE_IOS(4_0);
设置是否使用内联播放器播放视频
@property (nonatomic) BOOL mediaPlaybackRequiresUserAction NS_AVAILABLE_IOS(4_0);
设置视频是否自动播放
@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay NS_AVAILABLE_IOS(5_0);
设置音频播放是否支持ari play功能
@property (nonatomic) BOOL suppressesIncrementalRendering NS_AVAILABLE_IOS(6_0);
设置是否将数据加载如内存后渲染界面
@property (nonatomic) BOOL keyboardDisplayRequiresUserAction NS_AVAILABLE_IOS(6_0);
设置用户交互模式
三、iOS7中的一些新特性
下面这些属性是iOS7之后才有的,通过他们可以设置更加有趣的web体验
@property (nonatomic) UIWebPaginationMode paginationMode NS_AVAILABLE_IOS(7_0);
这个属性用来设置一种模式,当网页的大小超出view时,将网页以翻页的效果展示,枚举如下:
typedef NS_ENUM(NSInteger, UIWebPaginationMode) {
UIWebPaginationModeUnpaginated,//不使用翻页效果
UIWebPaginationModeLeftToRight,//将网页超出部分分页,从左向右进行翻页
UIWebPaginationModeTopToBottom,//将网页超出部分分页,从上向下进行翻页
UIWebPaginationModeBottomToTop,//将网页超出部分分页,从下向上进行翻页
UIWebPaginationModeRightToLeft//将网页超出部分分页,从右向左进行翻页
};
@property (nonatomic) CGFloat pageLength NS_AVAILABLE_IOS(7_0);
设置每一页的长度
@property (nonatomic) CGFloat gapBetweenPages NS_AVAILABLE_IOS(7_0);
设置每一页的间距
@property (nonatomic, readonly) NSUInteger pageCount NS_AVAILABLE_IOS(7_0);
获取分页数
四、webView协议中的方法
准备加载内容时调用的方法,通过返回值来进行是否加载的设置。web视图指示加载内容时通知。应该返回YES开始加载。导航提供的类型参数,是指请求的来源,可以是下列任何一个:
//UIWebViewNavigationTypeLinkClicked 用户触击了一个链接
//UIWebViewNavigationTypeFormSubmitted 用户提交了一个表单
//UIWebViewNavigationTypeBackForward 用户触击前进或返回按钮
//UIWebViewNavigationTypeReload 用户触击重新加载的按钮
//UIWebViewNavigationTypeFormResubmitted 用户重复提交表单
//UIWebViewNavigationTypeOther 发生其它行为
开始加载时调用的方法
结束加载时调用的方法
加载失败时调用的方法
五。补充
1.调用html中的js事件
js = [webView valueForKeyPath:@”documentView.webView.mainFrame.javaScriptContext”];
js[@”closewin”] = ^{
NSLog(@”closewin”);
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController popToRootViewControllerAnimated:YES];
});
};
2.webView.request.URL.absoluteString 将请求地址转换为字符串
再次补充:
前两天帮朋友处理个全web的应用(我本人是震惊的),有的地方劳保让调原生,于是乎又”温习了”一遍web,各种地方先整理出来,如果大家看有不合适的地方请留言,必回复.
1.
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
这个代理的方法是很常用的 一般在这里面.
navigationType 是一个UIWebViewNavigationType类型的枚举
UIWebViewNavigationTypeLinkClicked,
UIWebViewNavigationTypeFormSubmitted,
UIWebViewNavigationTypeBackForward,
UIWebViewNavigationTypeReload,
UIWebViewNavigationTypeFormResubmitted,
UIWebViewNavigationTypeOther
可以通过判断当前webview的请求是什么方式的来完成我们的需求.
request 参数是NSURLRequest类型,它的URL属性可以让我们准确的获取到网址,request.URL.absoluteString,转化为字符串.
return NO;//不加载网页
return YES;//加载网页
2.
webView的另一个重点是跟js的交互,这样可以让我们得到js中调用的方法和传递的参数.
首先创建个JSContext的对象.JSContext *context ;
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
最简单的调用js中的方法就是
context[@"jsFunction"] = ^{
NSLog("在这个大括号中写我们想要实现的东西,当web中调用JSFunction这个方法的时候")
}
如果说wb中的js方法是有参数的那我们也可以获取他传递的参数
context[@"nativeFunction"] = ^{
NSArray *thisArr = [JSContext currentArguments];
//获取到传递的参数的数组.例如html中传递了两个参数那么这个地方thisArr这个数组就包含两个值.其中存储的对象的类型是JSValue.
JSValue *jsValue = thisArr[0];
NSLog(@"==%@",jsValue.toString);
//JSValue 类型的对象其内部给我提供了转化的方法.点进去就能看到(点一下就够了),还有JSContext类型的属性,打印了看下不懂..
//- (id)toObject;
//- (id)toObjectOfClass:(Class)expectedClass;
//- (BOOL)toBool;
//- (double)toDouble;
//- (int32_t)toInt32;
//- (uint32_t)toUInt32;
//- (NSNumber *)toNumber;
//- (NSString *)toString;
//- (NSDate *)toDate;
//- (NSArray *)toArray;
//- (NSDictionary *)toDictionary;
NSString *payType = jsValue.toString;
//这样就完美的知道了我web页面传递的参数了.这个地方就可以将参数截取过来自己爱干哈干哈了.
};
3.还要一种就是往web中注入js代码 这个百度很多的就不说了,我个人觉得iOS 开发还是了解下js比较好.这样在这个地方自己也能很方便的写注入js代码.
stringByEvaluatingJavaScriptFromString 通过web的这个方法实现.
解析oc调用js的方法
知道的这么一种方法如下:
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@”showTitleMessage(‘%@’)”,@”oc调用了js的内容”]];
这里面%@左右的” 不能省略.
5.查找元素并隐藏
[webView stringByEvaluatingJavaScriptFromString:@”document.documentElement.getElementsByClassName(‘名称’)[0].style.display = ‘none’”];
6.获取js方法中的参数
NSArray *args = [JSContext currentArguments];
7.执行方法获得值
self.context[@”swiperMove”]=^{
NSString *str1 = [webView stringByEvaluatingJavaScriptFromString:@”$(‘.swiper-slide-active.content’).index();”];
NSLog(@”JS返回值:%@”,str1);
};
这里面的value 值也可以在我们这获取。
问题:如何能够直接调用scrollTo这个window的方法。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。