苹果官方对UIWebView
的介绍
You can use the UIWebView class to embed web content in your application. To doso, you simply create a UIWebView object, attach it to a window, and send it a request to load web content. You can also use this class to move back and forward in the history of webpages, and you can even set some web content properties programmatically.
UIWebView
是iOS
内置的浏览器控件,UIWebView
用于在App
中嵌入网页,通常是html
网页,也可以是PDF
、txt
文档等。苹果在发布iOS8
的时候,新增了一个WKWebView
组件,如果你的APP
只考虑支持iOS8
及以上版本,那么你就可以使用这个新的浏览器控件了。
本文只是探讨UIWebView
的使用方法。
属性
@property (nonatomic) BOOL scalesPageToFit;
自动适应屏幕尺寸
@property (nonatomic) BOOL detectsPhoneNumbers NS_DEPRECATED_IOS(2_0, 3_0);
自动检测网页上的电话号码,单击可以拨打,
iOS4
之后被下面的属性所代替。
@property (nonatomic) UIDataDetectorTypes dataDetectorTypes NS_AVAILABLE_IOS(3_0);
自动检测电话、网址和邮箱。枚举见下方代码。
1 | typedef NS_OPTIONS(NSUInteger, UIDataDetectorTypes) { |
@property (nonatomic) BOOL allowsInlineMediaPlayback NS_AVAILABLE_IOS(4_0);
// iPhone Safari defaults to NO. iPad Safari defaults to YES
UIWebView
中用html5
的video
方式播放视频时,在iPad
上是默认原来大小的,而在iPhone
上是默认全屏播放的。HTML
里video
必须加上webkit-playsinline
属性
@property (nonatomic) BOOL mediaPlaybackRequiresUserAction NS_AVAILABLE_IOS(4_0);
// iPhone and iPad Safari both default to YES
是否可以自动播放
html5
中的视频。
@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay NS_AVAILABLE_IOS(5_0);
// iPhone and iPad Safari both default to YES
是否可以使用
Air Play
。 在iPhone
和iPad
上默认使YES
。
@property (nonatomic) BOOL suppressesIncrementalRendering NS_AVAILABLE_IOS(6_0);
// iPhone and iPad Safari both default to NO
是否网页内容下载完毕才开始渲染
web
视图,默认为NO
。
@property (nonatomic) BOOL keyboardDisplayRequiresUserAction NS_AVAILABLE_IOS(6_0); // default is YES
是否在
web
页面响应用户输入弹出键盘,默认为YES
。
iOS7
增加了分页功能@property (nonatomic) UIWebPaginationMode paginationMode NS_AVAILABLE_IOS(7_0);
设置分页模式
1 | typedef NS_ENUM(NSInteger, UIWebPaginationMode) { |
@property (nonatomic) UIWebPaginationBreakingMode paginationBreakingMode NS_AVAILABLE_IOS(7_0);
设置分页打破模式
1 | typedef NS_ENUM (NSInteger, UIWebPaginationBreakingMode ) { |
@property (nonatomic) CGFloat pageLength NS_AVAILABLE_IOS(7_0);
每一页的长度
@property (nonatomic) CGFloat gapBetweenPages NS_AVAILABLE_IOS(7_0);
每一页的间距
@property (nonatomic) BOOL allowsPictureInPictureMediaPlayback NS_AVAILABLE_IOS(9_0);
画中画模式页面中返回
iOS9
新增属性
@property (nonatomic) BOOL allowsLinkPreview NS_AVAILABLE_IOS(9_0); // default is NO
使用
3DTouch
显示链接预览iOS9
新增属性
方法
1 | - (void)reload; //重新加载(刷新) |
代理方法
1 | - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; |
UIWebView 的高级用法
隐藏上下滚动时出边界的后面的黑色的阴影
1 | for (UIView *_aView in [webView subviews]){ |
禁用拖拽时的反弹效果
[(UIScrollView *)[[webView subviews] objectAtIndex:0] setBounces:NO];
判断用户点击类型
1 | - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType |
UIWebView
和JavaScript
的交互
Objective-C调用JavaScript
用Objective-C
调用JavaScript
会相对简单些,在UIWebView
加载完成之后调用UIWebView
的stringByEvaluatingJavaScriptFromString:
方法就行了。参数中的NSString
字符串就是js
的代码,可以是js
函数,也可以是js
代码。如下所示:
[myWebView stringByEvaluatingJavaScriptFromString:@"javascriptFunction()"];
Javascript调用Objective-C的函数
通过UIWebView
的重定向,通过在UIWebView
的代理函数webView:shouldStartLoadWithRequest:navigationType:
来监听URL
的变化,这个函数会在webview
加载URL
时回调,我们可以return YES
来让webview
继续加载内容,return NO
来停止继续加载新的内容。事先可以约定好几个虚假的URL
(比如tool://goToHomePage
),我们拿到定义好的URL
之后做对应的Objective-C
函数调用。在iOS7
中会出现代理方法无法调用的情况,具体原因不明。
实例
比如我们在javascript
文件里添加点击响应的函数
1 | function clickButton() { |
然后在webview
的代理函数中监听,如果是事先定义好的虚假URL
,就进行对应的处理
1 | -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { |
UIWebView 捕获 404, 403
1 | - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType |