今天碰到這樣一個場景,我需要一個僅僅用來展示網(wǎng)頁的頁面,那么在 iOS 9 中,我可以使用 SFSafariViewController,而在 iOS 8 及之前版本中,我會使用一個 WebView 來占據(jù)整個視圖空間,來做這件事。
就會有下面這行代碼
webview.frame = UIScreen.mainScreen().bounds
進一步地,我想把這個步驟封裝為一個函數(shù),因為比如這個頁面屏幕旋轉(zhuǎn)時,或者在其他頁面,我都可能需要用到它。
func expandView(view:UIView) {
if view.isKindOfClass(UIWebView) || view.isKindOfClass(WKWebView) {
view.frame = UIScreen.mainScreen().bounds
}
}
這段代碼是說,我們現(xiàn)在可以把 UIWebView 和 WKWebView 都擴展到最大了,其他 UIView 被傳入的時候,不會有任何意義。但這不是我想要的,我希望其他 UIView 根本無法調(diào)用這個函數(shù),以免產(chǎn)生誤解。
于是我寫了下面這段代碼:
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) }
}
現(xiàn)在,UIWebView 和 WKWebView 都可以通過 ExpandableView 這個協(xié)議,來使用我們定義好的(具有擴展一個 View 到整個界面大小這層意義的) expandToFullView 這個函數(shù),而且因為這個函數(shù)的實現(xiàn)實際上是 expand 這個函數(shù),所以他們表現(xiàn)起來是一樣的。與此同時,expand 這個函數(shù)本身被聲明為了 private,這使得這個函數(shù)不會在其他源文件以其他方式被調(diào)用。