文档章节

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

danielwyo
 danielwyo
发布于 2017/02/10 18:24
字数 1071
阅读 63
收藏 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设备上崩溃日志(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
开源手机自动化测试框架iQuery入门教程(一)

上次介绍iQuery之后,已经有些朋友在开始在手机自动化测试程序里试用iQuery了,由于之前的介绍文档比较含糊,先搁置扩展iQuery使其支持多种编程语言的系列文章,补充一下iQuery的入门教程,之...

知平软件
2012/09/12
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
100%移植阿里云移动测试技术_竟仅需1周?!——移动测试专有云(3)——内容详解

一、自动化测试服务 Android兼容性测试 Android兼容性测试旨在帮助解决Android应用在不同真机机型上的各类兼容性问题,包括 Crash/ANR分析、6项性能分析、UI检测、3个版本的覆盖安装检测等。...

乐乎无趣
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

正弦 余弦 角度 用于画时钟

<html> <head> <title>时钟</title> </head> <style> #canvas{ background: #1977ca } </style>......

一箭落旄头
31分钟前
2
0
drupal7自定义模块之表单(新手向)

前段时间要给网站做个高级搜索的功能,但drupal7自带的搜索远远无法满足需求,便有了自己开发的需求 我以前没有接触过drupal,做这个功能也是困难重重,几乎是从零开始,我将目光放到了自定义模块...

gcudwork
36分钟前
1
0
驰狼课堂

http://www.chilangedu.com/

求是科技
54分钟前
0
0
jumpserver 报错"Incorrect string value

申明 本文所有内容参考自jumpserver记录命令无法入库问题 #1773 简介 jumpserver 1.4.0在jumpserver.log中大量报错,错误日志 File "/opt/jumpserver/apps/terminal/api.py", line 246, i...

zhnxin
今天
2
0
用户管理相关配置文件及命令

9月19日任务 2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理 3.3 用户管理 扩展知识 实用小工具 简单命令行下实现Linux/Windows文件互传 前提:使用远程工具Xsh...

robertt15
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部