从零开始读MBProgressHUD(三)

从零开始读MBProgressHUD(三)

-layoutSubviews和drawRect:

本文主要技术点如下:

  1. -layoutSubviews的主要作用
  2. -layoutSubviews的调用
  3. setNeedsLayout和layoutIfNeeded的区别
  4. 分析MBProgressHUD类的-layoutSubviews代码
  5. 分析MBProgressHUD类的drawRect:代码

-layoutSubviews的主要作用

-layoutSubviews是UIView的属性方法,顾名思义,其用来布局子控件,通常在应用开发中,我们在该方法中计算子控件的Frame。

-layoutSubviews调用

Subclasses can override this method as needed to perform more precise layout of their subviews. You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want. You can use your implementation to set the frame rectangles of your subviews directly.

You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.

大意如下:当你需要精确布局子控件时,可以重载-layoutSubviews实现。不能直接调用layoutSubviews,如需强制更新布局,调用setNeedsLayout,如需立即更新,调用layoutIfNeeded。

force和immediately好像不是那么容易理解,继续查阅官方文档:

setNeedsLayout解释如下:

Call this method on your application’s main thread when you want to adjust the layout of a view’s subviews. This method makes a note of the request and returns immediately. Because this method does not force an immediate update, but instead waits for the next update cycle, you can use it to invalidate the layout of multiple views before any of those views are updated. This behavior allows you to consolidate all of your layout updates to one update cycle, which is usually better for performance.

layoutIfNeeded解释如下:

Use this method to force the layout of subviews before drawing. Using the view that receives the message as the root view, this method lays out the view subtree starting at the root.

总的来说,调用setNeedsLayout会设置一个需要重新绘制的标记,但方法会立即返回,在下一次update cycle才会重新绘制子控件(通常性能更优);而layoutIfNeeded的调用会导致立即强制刷新绘制子控件

MBProgressHUD类的-layoutSubviews

以下代码说明HUD其实是完全遮盖住父控件的,即HUD显示时其superView不能响应用户交互:

UIView *parent = self.superview;

if (parent) {

self.frame = parent.bounds;

}

totalSize是进度条+提示文字+详情文字所占据的总共尺寸,计算后最后赋值给HUD的对象属性size. HUD正中间的进度条及文字部分背景颜色区别与HUD背景色clearColor,但并不是简单的给另一个view设置背景色,具体见下一篇关于drawRect:方法的分析.在这个size范围内可以添加一个交互手势,通过CGRectContainsPoint()判断落点是否在size范围内来处理响应事件.

MBProgressHUD类的drawRect:

drawRect:方法主要用于帮助开发者进行图形的绘制,在MBProgressHUD类的drawRect:方法中主要完成以下两个功能:

  1. 根据BOOL属性dimBackground判断是否需要绘制明暗渐变效果
  2. 根据-layoutSubviews计算的size绘制出HUD正中间进度条和文字的背景

绘制使用Quartz2D完成,在此不作赘述.

时间: 2024-10-11 06:59:30

从零开始读MBProgressHUD(三)的相关文章

从零开始学习jQuery (三) 管理jQuery包装集

本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着学习如何管理jQuery包装集, 比如添加,删除,切片等. 二.前言 本系列的2,3篇上面列举了太多的API相信大家看着眼晕. 不过这些基础还必须要讲, 基础要扎实.其实对于这些列表大家可以跳过, 等以后用到时再回头看或者查询官方的API说明. 本章内容很少, 主要讲解动态创建元素和操作jQuery

HTML/CSS从零开始-常用属性(三)

一.css文本属性 (1)文本大小{font-size:value;} 单位:pt:9pt=12px;浏览器默认字体大小为16px          em:1em=16px;    在CSS2.0中    xx-small:9px     x-small:11px       small:13px       medium:16px       large:19px     x-large:23px    xx-large:27px (2)字体颜色 {color: rbg250,250,250/

从零开始学JavaScript三(变量)

一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义变量时要使用var操作符 如: var message; /*定义一个名为message的变量,该变量可以用来保存任何值,未初始化的变*量会保存一个特殊的值-undefined */ 二.局部变量 可以声明变量里同时初始化 function test(){ var message='hello'; //定义局部message变量,并初始值为hello a

C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题

在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文件并不允许多个线程同时写入,否则会提示“文件正在由另一进程使用,因此该进程无法访问此文件”. 这是文件的并发写入问题,就需要用到线程同步.而微软也给进程同步提供了一些相关的类可以达到这样的目的,本文使用到的 System.Threadin

从零开始学爬虫(三)------写入源文件的爬取

开始爬取网页:(2)写入源文件的爬取 为了使代码易于修改,更清晰高效的爬取网页,我们将代码写入源文件进行爬取. 主要分为以下几个步骤: 一.使用scrapy创建爬虫框架: 二.修改并编写源代码,确定我们要爬取的网页及内容 三.开始爬取并存入文件(数据库) 注:为了避免冗长的叙述,更直观地理解,这里先讲具体的操作方法,如果想要深入理解其原理,具体解释在最后. *操作方法: 1.创建爬虫框架 打开命令行,使用cd命令,进入你想要创建文件的位置 scrapy startproject 文件夹名称(假设

买股为什么不能等三年-读《三十年股票投资心得》

首先需要声明,本文纯属一个毫无远见和真才实学的小小散户的愚昧见解,仅供参考. 本人阅读了"三十年股票投资心得"这本书很多次.其中有一些章节提到了马来西亚股票市场的一些事情. 本人没有去过马来西亚,也没有买过马来西亚股票,所有的信息,都只是来源于"三十年股票投资心得"这本书,一些具体的数据我也懒的核实,就简单处理脑补了,不影响整体思路. 三十年股票投资心得书上写的一些内容,整理分享. ●你买了一间屋子,由跟发展商签约到发展商交屋给你,前后三年,你觉得这是理所当然的事,

注册制可能对我们带来的影响-读《三十年股票投资心得》

首先需要声明,本文纯属一个毫无远见和真才实学的小小散户的愚昧见解,仅供参考. 本人对注册制和审批制几乎没有任何系统的认知,只是阅读了"三十年股票投资心得"这本书很多次.其中有一些章节提到了马来西亚股票市场的一些事情. 本人没有去过马来西亚,也没有买过马来西亚股票,所有的信息,都只是来源于"三十年股票投资心得"这本书,一些具体的数据我也懒的核实,就简单处理脑补了,不影响整体思路(特别是一些历史性的汇率,这里都当人民币看). 马来西亚股票市场很有意思,以前是审批制,后来

数据存档和读档三种方式

using System.Collections;using System.Collections.Generic;using UnityEngine;using System.IO;using System.Runtime.Serialization.Formatters.Binary;using LitJson;using System.Xml; public class GameManager : MonoBehaviour{    public static GameManager _i

oracle从零开始学习笔记 三

笔试题 设有关系EMP(ENO,ENAME,SALARY,DNO)其中各属性的含义依次为职工号.姓名.工资.所在部门号, 以及关系DEPT(DNO,DNAME,MANAGER)其中各含义依次为部门号.部门名称.部门经理的职工号 1.请通过SQL语句创建表EMP.DEPT. create table emp(eno number(5) primary key ,ename varchar2(5),salary number(8),dno number(3)); create table dept(