文档章节

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

danielwyo
 danielwyo
发布于 2017/02/10 18:24
字数 1071
阅读 65
收藏 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
技术主管
私信 提问
获取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
0
0
ios界面自动化工具--Appium

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

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

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

大灰狼的小绵羊哥哥
11/13
0
0
iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码

iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件(http://www.code4app.com/thread-14507-1-1.html) iOS高仿微信完整项目源码(http://www.code4app.com/thread-14695-1-1.html)......

sunnyaigd
06/12
0
0
fir.im Weekly - iOS 开发中的 Git 流程

本期 fir.im Weekly 收集了微博上的热转资源,包含 Android、iOS 开发工具、源码等好用的轮子,还有一些 APP 设计的 Tips,希望对你有用。 精仿知乎日报 iOS 端 @我偏笑_NSNirvana花了将近一...

风起云飞fir_im
2015/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
0
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
2
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
昨天
0
0
Python的安装及文件类型、变量

一、为什么学习python 服务于大数据、人工智能、自动化运维。 简单易学 代码简洁 薪资高 近几年越来越火 二、Python的安装 linux 系统默认安装, CentOS7 默认安装了python2.7 安装ipython y...

枫叶云
昨天
1
0
JeeSite 4.x 树形结构的表设计和用法

有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章。 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理...

ThinkGem
昨天
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部