logo头像

小玉的技术博客

UIWebView的简单使用

前言

本文将为您介绍iOS中的WebView,一步步带你了解并掌握WebView的用法,JavaScript与Objective的交互,以及Cookie的管理、js的调试等。

UIWebView基本用法

UIWebView的创建

1
2
CGRect bouds = [UIScreen manScreen].bounds;
UIWebView * webView = [[UIWebView alloc] initWithFrame:bounds];

相关属性设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@property (nonatomic) UIWebPaginationMode paginationMode NS_AVAILABLE_IOS(7_0);
//这个属性用来设置一种模式,当网页的大小超出view时,将网页以翻页的效果展示,枚举如下:
typedef NS_ENUM(NSInteger, UIWebPaginationMode)
{
UIWebPaginationModeUnpaginated, //不使用翻页效果
UIWebPaginationModeLeftToRight, //将网页超出部分分页,从左向右进行翻页
UIWebPaginationModeTopToBottom, //将网页超出部分分页,从上向下进行翻页
UIWebPaginationModeBottomToTop, //将网页超出部分分页,从下向上进行翻页
UIWebPaginationModeRightToLeft //将网页超出部分分页,从右向左进行翻页
} __TVOS_PROHIBITED;
//设置每一页的长度
@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);
@property (nonatomic) UIWebPaginationBreakingMode paginationBreakingMode NS_AVAILABLE_IOS(7_0);
typedef NS_ENUM(NSInteger, UIWebPaginationBreakingMode)
{
UIWebPaginationBreakingModePage,
UIWebPaginationBreakingModeColumn
} __TVOS_PROHIBITED;
/**webView的代理**/
@property (nullable, nonatomic, assign) id <UIWebViewDelegate> delegate;
/**内置的scrollView**/
@property (nonatomic, readonly, strong) UIScrollView
*scrollView NS_AVAILABLE_IOS(5_0);
/**URL请求**/
@property (nullable, nonatomic, readonly, strong) NSURLRequest *request;
/**是否缩放到适合屏幕大小**/
@property (nonatomic) BOOL scalesPageToFit;
/**执行javaScript操作**/
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

加载属性

1
2
3
4
5
6
7
- (void)reload; //重新加载数据
- (void)stopLoading; //停止加载数据
@property (nonatomic, readonly, getter=isLoading) BOOL loading; //是否正在加载
- (void)goBack; //返回上一级
- (void)goForward; //跳转下一级
@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack; //能否返回上一级
@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward; //能否跳转下一级

多媒体属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//YES,自动检测网页上的电话号码,单击可以拨打
@property (nonatomic) BOOL detectsPhoneNumbers NS_DEPRECATED_IOS(2_0, 3_0);
//设置某些数据变为链接形式,这个枚举可以设置如电话号,地址,邮箱等转化为链接
@property (nonatomic) UIDataDetectorTypes dataDetectorTypes NS_AVAILABLE_IOS(3_0);
//设置是否使用内联播放器播放视频
@property (nonatomic) BOOL allowsInlineMediaPlayback NS_AVAILABLE_IOS(4_0); // iPhone Safari defaults to NO. iPad Safari defaults to YES
//设置视频是否自动播放
@property (nonatomic) BOOL mediaPlaybackRequiresUserAction NS_AVAILABLE_IOS(4_0); // iPhone and iPad Safari both default to YES
//设置音频播放是否支持ari play功能
@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay NS_AVAILABLE_IOS(5_0); // iPhone and iPad Safari both default to YES
//设置是否将数据加载如内存后渲染界面
@property (nonatomic) BOOL suppressesIncrementalRendering NS_AVAILABLE_IOS(6_0); // iPhone and iPad Safari both default to NO
//设置用户交互模式
@property (nonatomic) BOOL keyboardDisplayRequiresUserAction NS_AVAILABLE_IOS(6_0);

ios 9.0之后新特性

1
2
3
4
5
//是否允许画中画播放
@property (nonatomic) BOOL allowsPictureInPictureMediaPlayback NS_AVAILABLE_IOS(9_0);
//A Boolean value that determines whether pressing on a link displays a preview of the destination for the link.
This property is available on devices that support 3D Touch. Default value is NO.
@property (nonatomic) BOOL allowsLinkPreview NS_AVAILABLE_IOS(9_0); //

页面展示

1
[self.view addSubview:webView];

页面加载方法

UIWebView提供了三种加载html页面的方法

    • (void)loadRequest:(NSURLRequest *)request;
      通过NSURLRequest去加载html界面,可以去通过网络连接加载html资源,也可以去加载本地的html资源
      1
      2
      3
      4
      //加载网络地址
      NSURLRequest * request =[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]];
      [self.view addSubview:webView];
      [webView loadRequest:request];

2.- (void)loadHTMLString:(NSString )string baseURL:(nullable NSURL )baseURL;
加载html格式的字符串,其中的baseUrl下面会介绍

1
2
3
4
5
//加载本地Html
NSString * path = [[NSBundle mainBundle] pathForResource:@"swift" ofType:@"html"];
NSURL * url = [NSURL fileURLWithPath:path];//创建URL
NSURLRequest request = [NSURLRequest requestWithURL:url];//创建NSURLRequest
[webView loadRequest:request];//加载

3.- (void)loadData:(NSData )data MIMEType:(NSString )MIMEType textEncodingName:(NSString )textEncodingName baseURL:(NSURL )baseURL; (很少用)

UIWebView代理方法

当然,如果需要监听页面加载的结果,或者需要判断是否允许打开某个URL,那需要设置UIWebView的delegate,代理只需要遵循协议,并且在代理中实现下面的这些可选方法就可以:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//设置代理,同时实现UIWebViewDelegate
webView.delegate = self;
//代理方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
/**返回YES,进行加载。通过UIWebViewNavigationType可以得到请求发起的原因
如果为webView添加了delegate对象并实现该接口,那么在webView加载任何一个frame之前都会delegate对象的该方法,该方法的返回值用以控制是否允许加载目标链接页面的内容,返回YES将直接加载内容,NO则反之。并且UIWebViewNavigationType枚举,定义了页面中用户行为的分类,包括
UIWebViewNavigationTypeLinkClicked,用户触击了一个链接。
UIWebViewNavigationTypeFormSubmitted,用户提交了一个表单。
UIWebViewNavigationTypeBackForward,用户触击前进或返回按钮。
UIWebViewNavigationTypeReload,用户触击重新加载的按钮。
UIWebViewNavigationTypeFormResubmitted,用户重复提交表单
UIWebViewNavigationTypeOther,发生其它行为。
*/
return YES;
}
- (void)webViewDidStartLoad:(UIWebView *)webView
{
//开始加载,可以加上风火轮(也叫菊花)
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
//完成加载
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
//加载出错
}

支付宝打赏 微信打赏

赞赏是不耍流氓的鼓励