文档章节

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

danielwyo
 danielwyo
发布于 2017/02/10 18:24
字数 1071
阅读 67
收藏 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界面自动化工具--Appium

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

youthflies
2014/10/29
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
2018/06/12
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
0
0
ReactNative与iOS原生交互方式汇总

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

大灰狼的小绵羊哥哥
2018/11/13
0
0
iOS个人中心渐变动画、微信对话框、标签选择器、自定义导航栏、短信验证输入框等源码

iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画(http://www.code4app.com/thread-10860-1-1.html) 程序员取悦女票的正确姿势---Tip1(iOS美容篇)(http://www.code4app.com/th...

Android爱开源
前天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 姑娘馋的口水都留下来了。

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @且无需多言 :分享Fall Out Boy的单曲《Disloyal Order Of Water Buffaloes》 《Disloyal Order Of Water Buffaloes》- Fall Out Boy 手机党...

小小编辑
39分钟前
11
5
vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
2
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
9
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部