文档章节

iOS源码分析二十例 (1.MBProgressHUD)

danielwyo
 danielwyo
发布于 2017/02/10 18:24
字数 1071
阅读 270
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

 

MBProgressHUD的下载地址:

https://github.com/jdg/MBProgressHUD

 

整个MBProgressHUD只有两个文件, 一个.h和.m文件, 整体逻辑非常简单, 整个MBProgressHUD就是一个UIView, 所有的操作, 都是围绕着这个这个UIView进行的操作. 

代码中, 实现了如下类:

  1. MBProgressHUD, 主体功能类, 即对外的操作主功能所在. 
  2. MBProgressHUDDelegate, MBProgressHUD的代理, 内部只实现了一个函数, 也就是当整个HUD消失的时候, 会执行这个代理成员函数hudWasHidden. 
  3. MBRoundProgressView, MBProgressHUD中显示的圆形进度条. 
  4. MBBarProgressView, MBProgressHUD中显示的长条进度条.
  5. MBBackgroundView, MBProgressHUD的背景View.

从核心来说, MBProgressHUD源码只围绕着一个主体类来做的工作, 所以结构非常简单, 大致如下:

 


主要要理清的点如下:

1. removeFromSuperViewOnHide
Hud的这个成员变量, 功能非常普通, 就是判断如果这个值是真, 则在Hud隐藏的时候, 自动清除掉View. 它没有什么代码上的技巧, 但是, 对我们开发会有帮助, 那就是使用属性替代动作. 在实际代码中, 我们可以采用类似的做法, 如果遇到某个动作, 需要在特定条件才能触发的, 那么, 把它封装成属性, 当进入某个特定条件的时候, 自动触发动作, 这样, 对外部来说, 会减少一定的逻辑复杂度. 

2. CADisplayLink
这是一个特定的Timer, 它会在屏幕刷新的时候, 产生一个调用, 这样, 就能保证一些行为或数据变化, 跟屏幕刷新的间隔对应. 

3. UIVisualEffectView
产生效果的View, 比如需要UIBlurEffect, 这是一个非常简单的使用工具, 只要在需要产生效果的UIView上addSubView, 将UIVisualEffectView作为子View添加进去, 然后指定需要模糊的contentView, 即可产生实际的模糊效果输出. 在MBProgressHUD中, 这部分让我特别奇怪, 它并没有产生任何作用, 没有指定contentView, 也就是说, 没有实际的模糊效果, 如果这样的话, 这是一段多余的代码.

4. UIApplicationDidChangeStatusBarOrientationNotification
当手机产生方向切换的时候, 产生这个消息, MBProgressHUD考虑的比较细致, 当界面切换的时候, 做到显示的内容不出错. 

5. appearanceWhenContainedIn:
为UIView添加appearanceWhenContainedIn, 这是比较通用的界面定制方法, 它限定了只对特定的类设定界面展示, 以免污染其它普通的UIView部分.

6. MotionEffect
手机运动效果, 在手机移动的时候, 产生移动效果. 这个效果目前就是由UIInterpolatingMotionEffect来生成, 主要是指定center.x [UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis] / center.y [UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis] 来产生移动效果, 这样, 在手机晃动的时候, 界面上的MBProgressHUD会产生晃动效果.


7. Progress / NSProgress
这是一个非常特殊的功能, 可以实现跨模块的数据状态更新逻辑, 同时, 由于它具有组合功能, 可以将一些行为作为子进度加入进来, 这样可以根据最上层的Progress来获取数值点. 


8. 每次执行绘图的时候, 都要判断一下NSThread isMainThread
这样, 可以防止一些绘图操作在子线程中执行的问题, 这是一个开发的安全策略.


MBProgressHUD没有用到特别复杂的设计, 整体逻辑全部在一个类中, 并不涉及任何复杂的架构, 这也是我为什么先拿这个相对比较简单的库开到的原因. MBProgressHUD的UIView层次设计:

 

 

个人对MBProgressHUD源码阅读后的看法:

  1. 本身过于复杂, 将所有功能集合在一个View里面, 耦合性太强, 会导致整个代码比较难分解. 
  2. 细节做得不错, 考虑到很多可能性的点, 做得非常细致, 值得大部分开发者学习.

 

下一期的预告: DZNEmptyDataSet

 

 

© 著作权归作者所有

danielwyo
粉丝 1
博文 13
码字总数 19257
作品 0
技术主管
私信 提问
加载中

评论(0)

ios界面自动化工具--Appium

ios界面自动化工具--Appium Appium是一款开源的移动端自动化测试框架,支持Android和Ios,之前简单介绍过Appium,链接http://www.yeetrack.com/?p=639。最近在做ios的自动化测试,再详细记录一...

youthflies
2014/10/29
1.6K
0
ReactNative与iOS原生交互方式汇总

前言 最近用RN开发SDK,涉及RN与iOS各种交互。 有些交互比如用iOS原生切换多个RN页面,以及iOS调用RN的方法,按照网上的方法调不通,一度不知如何是好,网上资料比较少。 于是自己看RN源码分...

大灰狼的小绵羊哥哥
2018/11/13
0
0
iOS开发经验总结,我的2019进阶之路!

4G改变了生活,抓住机会的人已经在这个社会有了立足之地,马上迎来5G的时代,你做好准备了吗!对于即将迎来的5G时代,无疑会是音视频的又一个高潮!那么作为程序员的我们,应该怎么样去迎接它...

卓远
2019/04/11
0
0
获取iOS设备上崩溃日志(Crash Log)的方法

获取iOS设备上崩溃日志(Crash Log)的方法:http://www.weste.net/2013/5-20/91509.html iOS怎么分析AppStore上面的Crash Log:http://m.blog.csdn.net/blog/tianjf0514/45201549 iOS Cra......

智能小松鼠
2015/08/25
1.3K
0
iOS开发,我的2018进阶之路总结!

4G改变了生活,抓住机会的人已经在这个社会有了立足之地,马上迎来5G的时代,你做好准备了吗! 对于即将迎来的5G时代,无疑会是音视频的又一个高潮!那么作为程序员的我们,应该怎么样去迎接...

_小迷糊
2019/01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

c/c++编写window服务的授权服务(二)

//c/c++编写window服务的授权服务(二) //定义授权服务的头文件LicenseService.h #pragma once //建立工程:win32控制平台应用程序 //LicenseService.cpp //用C/C++编写的Window服务一例 //安...

osc_wxsc35it
29分钟前
13
0
开发一个大型后台管理系统,应该用前后端分离的技术方案吗?

话说这天,我们团队开会讨论了一个问题,不,与其说“讨论”,不如说“争吵”更合适。 背景是这样的: 我们要开发一个 xxx 后台管理系统,这个系统业务复杂、功能又多,大家的争吵集中在“这...

osc_qalfjuu8
31分钟前
15
0
美团点评的移动端网络优化实践:大幅提升连接成功率、速度等

1、引言 网络优化对于移动端App产品的用户体验至关重要,也与公司的运营和营收息息相关。 这里列举两个公开的数据: “《页面加载超过3秒,57%的用户会离开》” “《Amazon页面加载延长1秒,...

imtech
32分钟前
11
0
在webstorm 中直接运行ts文件

安装插件后重启IDE Run Configuration for TypeScript

阿豪boy
32分钟前
25
0
PyCharm2020激活破解教程

本文内容皆为作者原创,如需转载,请注明出处:https://www.cnblogs.com/xuexianqi/p/12767075.html 正版肯定是要支持的,但是贫穷限制了我。现在买是不可能买的,只能靠着破解激活来维持生计...

osc_91g5cdgs
33分钟前
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部