今天碰到这样一个场景,我需要一个仅仅用来展示网页的页面,那么在 iOS 9 中,我可以使用 SFSafariViewController,而在 iOS 8 及之前版本中,我会使用一个 WebView 来占据整个视图空间,来做这件事。
就会有下面这行代码
webview.frame = UIScreen.mainScreen().bounds
进一步地,我想把这个步骤封装为一个函数,因为比如这个页面屏幕旋转时,或者在其他页面,我都可能需要用到它。
func expandView(view:UIView) {
if view.isKindOfClass(UIWebView) || view.isKindOfClass(WKWebView) {
view.frame = UIScreen.mainScreen().bounds
}
}
这段代码是说,我们现在可以把 UIWebView 和 WKWebView 都扩展到最大了,其他 UIView 被传入的时候,不会有任何意义。但这不是我想要的,我希望其他 UIView 根本无法调用这个函数,以免产生误解。
于是我写了下面这段代码:
protocol ExpandableView {
func expandToFullView()
}
private func expand(view:UIView) {
view.frame = UIScreen.mainScreen().bounds
}
extension WKWebView: ExpandableView {
func expandToFullView() { expand(self) }
}
extension UIWebView: ExpandableView {
func expandToFullView() { expand(self) }
}
现在,UIWebView 和 WKWebView 都可以通过 ExpandableView 这个协议,来使用我们定义好的(具有扩展一个 View 到整个界面大小这层意义的) expandToFullView 这个函数,而且因为这个函数的实现实际上是 expand 这个函数,所以他们表现起来是一样的。与此同时,expand 这个函数本身被声明为了 private,这使得这个函数不会在其他源文件以其他方式被调用。