原文链接:http://www.jianshu.com/p/553424763585
随着 H5 的发展,在 iOS 开发中,网页视图的使用率逐渐提升,为了增加代码封装度、减轻开发负担,因此通常会对网页视图进行通用类的封装,本文简单讲述网页视图控制器通用类的封装流程,希望对大家有所帮助。 —— 由 卖报的小画家Sure 分享
前言

随着H5的发展,在iOS开发中,网页视图的使用率逐渐提升,为了增加代码封装度、减轻开发负担,因此通常会对网页视图进行通用类的封装,本文简单讲述网页视图控制器通用类的封装流程,希望对大家有所帮助。

本文与上篇《一劳永逸,iOS引导蒙版封装流程》为同一系列,均为通用类封装流程分享,欢迎感兴趣的朋友前往阅读。

需要解决的问题:
  • 版本适配(UIWebView&&WKWebView)
  • 导航按钮快捷设置(返回&&关闭)
  • 修复自定义导航按钮侧滑手势失效问题
  • 侧滑手势返回上层网页功能
  • 网页加载进度显示
  • 网页下拉刷新
  • 请求异常占位图
效果图演示
一、版本适配问题

在真实的开发中我们可能对UIWebView“爱不释手”,因其调用简单,使用方便,但其会占用程序的大量内存,加载速度慢,体验效果并不是很好,WKWebView为iOS8推出的网页展示视图,相比UIWebView,其占用的内存更小,请求效率更高,因此极力推荐大家使用WKWebView。

因此在网页视图的创建方面首先进行版本适配,对于大于iOS8的系统我们采用WKWebView,反之使用UIWebView。

- (void)createWebView {self.automaticallyAdjustsScrollViewInsets = NO;if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 8.0) {[self.view addSubview:self.wk_WebView];} else {[self.view addSubview:self.webView];}
}
二、导航按钮快捷设置(返回&&关闭)

该功能的实现比较简单,我们可以根据webView或wk_webView的goBack方法进行判断,检测当前网页是否存在可返回的上一界面,若存在显示返回与关闭按钮,若不存在显示返回按钮即可。

- (void)showLeftBarButtonItem {if ([_webView canGoBack] || [_wk_WebView canGoBack]) {self.navigationItem.leftBarButtonItems = @[self.backBarButtonItem,self.closeBarButtonItem];} else {self.navigationItem.leftBarButtonItem = self.backBarButtonItem;}
}

closeBarButtonItem所处理的事件为关闭界面操作即

- (void)close:(UIBarButtonItem*)item {[self.navigationController popViewControllerAnimated:YES];
}

backBarButtonItem需根据网页是否可返回前一界面触发返回前界面或关闭操作

- (void)back:(UIBarButtonItem*)item {if ([_webView canGoBack] || [_wk_WebView canGoBack]) {[_webView goBack];[_wk_WebView goBack];} else {[self.navigationController popViewControllerAnimated:YES];}
}

在这里我们也可以对导航栏标题进行设置,使其为当前网页标题,在网页加载完成方法中简单调用JS语句document.title即可,webView与WkWebView调用JS方法有所区别,如下代码所示:

//WebView
self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
//WkWebView
[webView evaluateJavaScript:@"document.title" completionHandler:^(id _Nullable title, NSError * _Nullable error) {self.navigationItem.title = title;
}];

对于WKWebView我们还可以通过监听title属性进行实现。

三、修复自定义导航按钮侧滑手势失效

在第二步我们手动设置了导航栏左按钮,因此我们会发现系统自带的侧滑返回功能失效了,为了可实现网页的侧滑返回功能,我们需要修复其失效的问题。

- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];if (self.navigationController.viewControllers.count > 1) {self.delegate = self.navigationController.interactivePopGestureRecognizer.delegate;self.navigationController.interactivePopGestureRecognizer.delegate = self;}
}- (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:animated];self.navigationController.interactivePopGestureRecognizer.delegate = self.delegate;
}- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {return self.navigationController.viewControllers.count > 1;
}- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {return self.navigationController.viewControllers.count > 1;
}
四、侧滑手势返回上层网页功能

对于WKWebView系统为我们提供了很好的一种实现效果,设置WkWebView的allowsBackForwardNavigationGestures为YES即可开启屏幕左边缘右滑返回与屏幕右边缘左滑返回效果。(PS:楼主曾花费一整天的时间尝试实现这个效果,没想到苹果已准备好了(╯‵□′)╯︵┻━┻ )

_wk_WebView.allowsBackForwardNavigationGestures = YES;
五、网页加载进度显示功能

对于WKWebView我们可以使用KVO监听属性estimatedProgress即可获取加载进度的变化,而对于UIWebView推荐使用NJKWebViewProgress进行添加。

[_wk_WebView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:NULL];- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<nskeyvaluechangekey,id> *)change context:(void *)context {if ([keyPath isEqualToString:@"estimatedProgress"]) {_loadingProgressView.progress = [change[@"new"] floatValue];if (_loadingProgressView.progress == 1.0) {dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{_loadingProgressView.hidden = YES;});}}
}</nskeyvaluechangekey,id>

既然添加了监听,因此不要忘记在dealloc中进行移除

- (void)dealloc {[_wk_WebView removeObserver:self forKeyPath:@"estimatedProgress"];
}
六、网页下拉刷新(iOS10新特性)

iOS10中为ScrollView添加了下拉刷新控件,而WebView里层控件即为ScrollView,因此我们可以为网页添加下拉刷新功能。这里选择使用系统原生控件UIRefreshControl,考虑某些网页页面并不需要下拉刷新功能,因此已公开BOOL加以限制,如需要可手动置为YES。

//添加下拉刷新
if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 10.0 && _canDownRefresh) {_wk_WebView.scrollView.refreshControl = self.refreshControl;
}
七、请求异常占位图问题

在网址请求失败或显示空白页面时需显示占位图提示用户。我们分别需要在网页请求失败以及开始加载时加以判断。以WKWebView为例。

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error{webView.hidden = YES;
}
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation{webView.hidden = NO;_loadingProgressView.hidden = NO;//不加在空白网页if ([webView.URL.scheme isEqual:@"about"]) {webView.hidden = YES;}
}

至此,一个简单的网页视图控制器即初步封装完毕,后续会添加JS交互及HTTPS认证等模块。

demo已上传GitHub
一劳永逸,iOS网页视图控制器通用类封装

一劳永逸,iOS 网页视图控制器通用类封装相关推荐

  1. iOS中视图控制器指定自定义UIView

    他的好处就是在程序执行viewDIdLoad之前可以把我们需要用的数据加载完成.这也是减轻控制器的负担之一的办法.但是我个人觉得好是每有数据的延迟加载的功能牛.延迟加载只在数据需要的时候才被加载到视图 ...

  2. IOS 中视图控制器的生命周期

    1.init Allocating critical data structures required by your view controller 不要出现创建view的代码.良好的设计,在ini ...

  3. Unity WebView 插件⭐️(十三)特定模块 iOS网页视图—iOSWebViewWebView

  4. IOS开发之视图和视图控制器

    视图(View), 视图控制器(ViewController)是IOS开发UI部分比较重要的东西.在学习视图这一块的东西的时候,感觉和Java Swing中的Panel差不多.在UIKit框架中都有一 ...

  5. [转]iOS 视图控制器转场详解

    转自:http://blog.devtang.com/2016/03/13/iOS-transition-guide/ 前言 屏幕左边缘右滑返回,TabBar 滑动切换,你是否喜欢并十分依赖这两个操作 ...

  6. iOS常用动画 类封装

    //这是一个很好的动画封装类 很容易明白很详细 和大家分享 // CoreAnimationEffect.h // CoreAnimationEffect // // Created by Vince ...

  7. iOS翻页视图控制器UIPageViewController的应用

    2019独角兽企业重金招聘Python工程师标准>>> iOS翻页视图控制器UIPageViewController的应用 一.引言 UIPageViewController是iOS ...

  8. iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法

    一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能, ...

  9. iOS 获取当前正在显示的视图控制器ViewController(最全)

    目录 先插入以下介绍以下本编文章除标题所讲知识外,还额外包含的内容有如下: 1.获取当前显示的视图控制器ViewController 2.如何在多次presentViewController后直接返回 ...

最新文章

  1. 如何管理好自己的性格?
  2. 基于ESP32的智能车竞赛新版裁判系统的软件功能要求与实现
  3. 脑电分析系列[MNE-Python-2]| MNE中数据结构Raw及其用法简介(更新)
  4. Python正则表达式介绍 re.findall(pattern, str, flag=0)/re.I re.L re.M
  5. 多种方法求解八数码问题
  6. hive函数参考手册
  7. 英语单词中后缀-ee和-er的区别
  8. NSOperation
  9. USYD悉尼大学INFO1110 详细作业解析Week4 revision(未更新完)
  10. JavaScript 入门(一)
  11. 解决谷歌无法加载扩展程序
  12. Base编码(贝斯家族)
  13. 浮动的简介——CSS
  14. 头条面试官:在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?
  15. electron-vue + electron-updater 实现自动更新(全量更新)
  16. 苏州企业拿到商标注册证后,需要注意哪些事项?
  17. 被遗忘的Windows快捷键
  18. 记事本TXT中文默认保存的ANSI格式文件乱码,一些软件菜单乱码,右键菜单某些乱码...
  19. 电路中滤波电容和退耦电容_带你学习退耦电容的PCB布局
  20. JAVA语言考试系统的设计与实现(论文+源代码+文献综述+外文翻译+开题报告)

热门文章

  1. BZOJ 2957楼房重建
  2. Jmeter性能测试 入门
  3. PHP开发中,让var_dump调试函数输出更美观 ^_^#
  4. 关于登录记住密码使用cookie的详解
  5. 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]
  6. OpenLayers 动态添加标记(Marker)和信息窗(Popup)
  7. PHP网站首页打不开的原因讲起
  8. 给网站管理员的建议:创建可利用的、可抓取的网站
  9. 防止SQL注入式攻击
  10. FreeType简介及在vs2010的编译使用