UIWebView
UIWebView看名字就知道是可以加载web页面的控件, 下面我们学习如何使用它
1. UIWebView的创建
let webView = UIWebView(frame: self.view.bounds)
webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.youkuaiyun.com/")!))
webView.paginationMode = .LeftToRight
webView.scalesPageToFit = true
self.view.addSubview(webView)
注意在iOS9上的系统中要在info.plist中设置一下, 具体参考UIImageView中加载网络图片的部分
运行程序:
上面的代码中我们设置了加载csdn主页,并设置页面缩放以适应界面
2. UIWebView的属性详解
// 代理
unowned(unsafe) public var delegate: UIWebViewDelegate?
@available(iOS 5.0, *)
// 获取scrollView
public var scrollView: UIScrollView { get }
// 获取请求
public var request: NSURLRequest? { get }
// 是否可上一页
public var canGoBack: Bool { get }
// 是否可下一页
public var canGoForward: Bool { get }
// 是否正在加载
public var loading: Bool { get }
// 是否缩放页面以适应界面
public var scalesPageToFit: Bool
// 数据类型检测,和UITextView中一样
@available(iOS 3.0, *)
public var dataDetectorTypes: UIDataDetectorTypes
// 使用内置html5播放视频还是使用本地的播放器全屏播放, iPhone Safari默认为false, iPad Safari默认为true
@available(iOS 4.0, *)
public var allowsInlineMediaPlayback: Bool
// 是否由用户来启动播放, 默认iPhone 和 iPad Safari都为true
@available(iOS 4.0, *)
public var mediaPlaybackRequiresUserAction: Bool
// 是否允许AirPlay, 默认iPhone 和 iPad Safari都为true
@available(iOS 5.0, *)
public var mediaPlaybackAllowsAirPlay: Bool
// 是否将内容加载到内存中再渲染, 默认iPhone 和 iPad Safari都为false
@available(iOS 6.0, *)
public var suppressesIncrementalRendering: Bool
// 用户是否点击输入元素来显示键盘, 默认为true
@available(iOS 6.0, *)
public var keyboardDisplayRequiresUserAction: Bool
// 自动分页模式,具体查看下面的内容
@available(iOS 7.0, *)
public var paginationMode: UIWebPaginationMode
// CSS加载方式
@available(iOS 7.0, *)
public var paginationBreakingMode: UIWebPaginationBreakingMode
// 页长
@available(iOS 7.0, *)
public var pageLength: CGFloat
// 页间距
@available(iOS 7.0, *)
public var gapBetweenPages: CGFloat
// 页数
@available(iOS 7.0, *)
public var pageCount: Int { get }
// 是否允许画中画
@available(iOS 9.0, *)
public var allowsPictureInPictureMediaPlayback: Bool
// 是否允许链接预览, 默认为false
@available(iOS 9.0, *)
public var allowsLinkPreview: Bool
分页模式:
多余超出部分
public enum UIWebPaginationMode : Int {
case Unpaginated // 不分页
case LeftToRight // 由左到右
case TopToBottom // 由上到下
case BottomToTop // 由下到上
case RightToLeft // 由右到左
}
CSS加载方式:
public enum UIWebPaginationBreakingMode : Int {
case Page // 页
case Column // 列
}
3. UIWebView的方法
// 加载请求的3种方式
public func loadRequest(request: NSURLRequest)
public func loadHTMLString(string: String, baseURL: NSURL?)
public func loadData(data: NSData, MIMEType: String, textEncodingName: String, baseURL: NSURL)
// 重新加载
public func reload()
// 停止加载
public func stopLoading()
// 上一页
public func goBack()
// 下一页
public func goForward()
// 执行js代码
public func stringByEvaluatingJavaScriptFromString(script: String) -> String?
4. UIWebView的代理
我们查看UIWebViewDelegate的定义
public protocol UIWebViewDelegate : NSObjectProtocol {
// 开始加载之前调用
@available(iOS 2.0, *)
optional public func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool
// 开始加载时调用
@available(iOS 2.0, *)
optional public func webViewDidStartLoad(webView: UIWebView)
// 加载完成时调用
@available(iOS 2.0, *)
optional public func webViewDidFinishLoad(webView: UIWebView)
// 加载出现错误时调用
@available(iOS 2.0, *)
optional public func webView(webView: UIWebView, didFailLoadWithError error: NSError?)
}
5.完整代码
特别说明一下, 对于app中经常变动的部分, 用UIWebView是非常有用的, 像p2p行业, 基本上个把星期就推出一个新的活动, 让做web前端的兄弟把活动页写好, 后端的兄弟将内容放到约定好的地址,app中用UIWebView加载一下即可, 这样就不用每次出活动都更新一版了, 事实上你也不可能那么及时, app审核也要一个星期, 要是后端的兄弟在没有协商的情况下就放了一些内容(有次审核的那天, 后端的哥们上了个抽奖的转盘,奖品还有iPhone, 还没有告诉我们 ), 结果被无情的审核不通过,好了扯远了.
下面是完成代码:
import UIKit
class ViewController12: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let webView = UIWebView(frame: self.view.bounds)
webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.youkuaiyun.com/")!))
webView.paginationMode = .LeftToRight
webView.scalesPageToFit = true
self.view.addSubview(webView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}