文档章节

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

danielwyo
 danielwyo
发布于 2017/02/10 18:24
字数 1071
阅读 58
收藏 0
点赞 0
评论 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天气动画、高仿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

iOS源码补完计划--AFNetworking 3.1.0源码研读

参拜一下AFNetworking的源码。 第四篇源码、暂时来看也是iOS方向的最后一篇、撸完准备趁着热乎撸一撸网络协议。 目录 准备工作 功能模块 AFURLSessionManager/AFHTTPSessionManager AFNetwo...

kirito_song ⋅ 05/25 ⋅ 0

如何做好iOS应用安全?这有一把行之有效的“三板斧”

本文由 网易云 发布 iOS应用面临很多破解问题,常见的有IAP内购破解、山寨版本、破解版本等;大众应用上,微信抢红包、微信多开等;而在iOS游戏上,越来越泛滥的外挂问题也不断困扰着游戏厂商...

wangyiyungw ⋅ 05/15 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift(http://www.code4app.com/thread-30244-1-1.html) Space Battle 宇宙大战 SpriteKit游戏源码(http://www.code4app.com/thread-30246-1-1.html) LLDebugTo......

sunnyaigd ⋅ 06/19 ⋅ 0

bug的一生:如何体现测试专业度?

bug的一生:如何体现测试专业度? 2018-06-15 16:38编辑: garace分类:程序人生来源:代码湾 测试程序员bug 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师 京东招聘iOS开发工...

garace ⋅ 06/15 ⋅ 0

iOS自定义弹出视图、收音机APP、图片涂鸦、加载刷新、文件缓存等源码

iOS精选源码 一款优秀的 聆听夜空FM 源码(http://www.code4app.com/thread-14546-1-1.html) zhPopupController 简单快捷弹出自定义视图(http://www.code4app.com/thread-14861-1-1.html) WHS......

sunnyaigd ⋅ 06/04 ⋅ 0

iOS三维菜单、调试工具、封装通讯录、网络框架、多种控件和动画等源码

iOS精选源码 一个调用系统通讯录和获取通讯录所有联系人的封装(http://www.code4app.com/thread-29726-1-1.html) ios scrollview嵌套tableview同向滑动(初级、进阶), 支持OC / Swift(http...

sunnyaigd ⋅ 05/15 ⋅ 0

iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd ⋅ 04/17 ⋅ 0

(iOS) FFmpeg iOS 上的安装(可以指定任意版本) 一

一、准备部分 1、去FFmpeg官网下载所需要的版本的源码:官网源码下载地址 2、安装Homebrew: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" ...

wf990051004 ⋅ 04/26 ⋅ 0

iOS基础深入补完计划--NSURLSession使用详解(附Demo)

目录 前言 API Demo 前言 本文主要是把NSURLSession以及NSURLSessionTask相关的代理方法全部整理了一下。 旨在大体了解在一个iOS网络请求中、一个任务究竟经理了什么。 而我们、又能做些什么...

kirito_song ⋅ 05/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JDK1.6和JDK1.7中,Collections.sort的区别,

背景 最近,项目正在集成测试阶段,项目在服务器上运行了一段时间,点击表格的列进行排序的时候,有的列排序正常,有的列在排序的时候,在后台会抛出如下异常,查询到不到数据,而且在另外一...

tsmyk0715 ⋅ 21分钟前 ⋅ 0

spring RESTful

spring RESTful官方文档:http://spring.io/guides/gs/rest-service/ 1. 可以这么去理解RESTful:其实就是web对外提供的一种基于URL、URI的资源供给服务。不是一个原理性知识点。是一个方法论...

BobwithB ⋅ 23分钟前 ⋅ 0

C++ 中命名空间的 5 个常见用法

相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名...

柳猫 ⋅ 25分钟前 ⋅ 0

@Conditional派生注解

@Conditional派生注解(Spring注解版原生的@Conditional作用) 作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效; @Conditional扩展注解 作用(判...

小致dad ⋅ 26分钟前 ⋅ 0

适配器模式

适配器模式 对象适配器 通过私有属性来实现的类适配器 通过继承来实现的接口适配器 通过继承一个默认实现的类实现的

Cobbage ⋅ 30分钟前 ⋅ 0

Java 限流策略

概要 在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速...

轨迹_ ⋅ 33分钟前 ⋅ 0

GridView和子View之间的间隙

默认的情况下GridView和子View之间会有一个间隙,原因是GridView为了在子View被选中时在子View周围显示一个框。去掉的办法如下: android:listSelector="#0000" 或 setSelector(new ColorDra...

国仔饼 ⋅ 37分钟前 ⋅ 0

idea插件开发

1 刷新页面要使用多线程 2 调试要使用restart bug 不要去关闭调试的idea 否则再次启动会卡住

林伟琨 ⋅ 37分钟前 ⋅ 0

Java 内存模型

物理机并发处理方案 绝大多数计算任务,并不是单纯依赖 cpu 的计算完成,不可避免需要与内存交互,获取数据。内存要拿到数据,需要和硬盘发生 I/O 操作。计算机存储设备与 cpu 之间的处理速度...

长安一梦 ⋅ 44分钟前 ⋅ 0

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简...

之渊 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部