当前位置: 首页 > 编程日记 > 正文

ios uiview 如何刷新_UIView的重绘及布局刷新

本文将简要讨论以下几个问题:

1、UIView的drawRect方法的调用机制及注意点

2、UIView的layoutSubviews、layoutIfNeeded、setNeedsLayout等方法的调用机制

3、如何通过更新view的约束值来实现动画效果

e9ca7dfb5d72

博客配图

重绘机制 - drawRect

方法定义

Drawing and Updating the View

-drawRect:

Draws the receiver’s image within the passed-in rectangle.

-setNeedsDisplay

Marks the receiver’s entire bounds rectangle as needing to be redrawn.

-setNeedsDisplayInRect:

Marks the specified rectangle of the receiver as needing to be redrawn.

- (void)drawRect:(CGRect)rect //重写此方法,执行重绘任务

- (void)setNeedsDisplay //标记为需要重绘,异步调用drawRect

- (void)setNeedsDisplayInRect:(CGRect)rect //标记为需要局部重绘

重绘操作是在drawRect方法中完成,但是苹果不建议直接调用drawRect方法,当然如果你强制直接调用此方法是没有效果的。苹果要求我们调用UIView类中的setNeedsDisplay方法,则程序会自动调用drawRect方法进行重绘。

调用机制

drawRect调用是在Controller->loadView,Controller->viewDidLoad 两方法之后调用的。所以不用担心在控制器中,这些View的drawRect就开始画了。这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).

1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。

2、该方法在调用sizeThatFits后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。(sizeToFit会自动调用sizeThatFits方法)

3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:

4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0

(以上1、2推荐,3、4不提倡)

drawRect方法使用注意点

1、 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate 的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或 者 setNeedsDisplayInRect,让系统自动调该方法。

2、若使用calayer绘图,只能在drawInContext: 中(类似于drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法。

3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来调用setNeedsDisplay实时刷新屏幕

4、随意使用drawRect可能引入内存暴增的问题,参考内存恶鬼drawRect

布局刷新

如果你的APP没有用 Auto Layout,下面的方法可以实现手动 Layout

- (void)layoutSubviews //对subviews重新布局

- (void)layoutIfNeeded //如果有标记则立即重新布局

- (void)setNeedsLayout //标记为需要重新布局

调用机制

1、init初始化不会触发layoutSubviews。

2、addSubview会触发layoutSubviews。

3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。

4、滚动一个UIScrollView会触发layoutSubviews。

5、旋转Screen会触发父UIView上的layoutSubviews事件。

6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。

7、直接调用setNeedsLayout。

在苹果的官方文档中强调:You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.

layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。

反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。

刷新子对象布局

- (void)layoutSubviews:这个方法,默认没有做任何事情,需要子类进行重写

- (void)setNeedsLayout: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用

- (void)layoutIfNeeded:如果有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局

在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]。

- (void)updateConstraintsIfNeeded:立即触发约束更新,自动更新布局

- (void)updateConstraints:自定义view应该重写此方法在其中建立constraints.

注意:要在实现最后调用[super updateConstraints]

- (BOOL)needsUpdateConstraints:constraint-based layout system使用此返回值去决定是否需要调用updateConstraints作为正常布局过程的一部分

- (void)setNeedsUpdateConstraints:当一个自定义view的某个属性发生改变,并且可能影响到constraint时,需要调用此方法去标记constraints需要在未来的某个点更新,系统然后调用updateConstraints

UIView动画

注意:如果你通过改变约束值来实现动画效果,然而发现并没有动画,那可能是你没有调用layoutIfNeeded方法。

举个栗子:在ViewController的View上添加一个subView和button并添加相关约束,通过点击button更改subView的约束值来实现动画效果,代码如下:

[UIView animateWithDuration:0.5 animations:^{

self.leftConstr.constant = 200;//初始约束值为20

} completion:nil];

上面的代码是看不到动画效果的,你应该这样写:

self.leftConstr.constant = 200;

[UIView animateWithDuration:0.5 animations:^{

[self.view layoutIfNeeded];

} completion:nil];

这是因为self.leftConstr.constant = 200只执行了setNeedsLayout方法标记了需要重新布局,但没有立即执行。相反,如果一些变化不想动画,可以在动画方法前执行layoutIfNeeded方法。

相关文章:

Ueditor和CKeditor 两款编辑器的使用与配置

一丶ueditor 百度编辑器 1.官方文档,演示,下载地址:http://ueditor.baidu.com/website/index.html 2.百度编辑器的好:Editor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制&#xff…

Datawhale组队学习周报(第032周)

希望开设的开源内容 目前Datawhale的开源内容分为两种:第一种是已经囊括在我们的学习路线图内的Datawhale精品课,第二种是暂未囊括在我们的学习路线图内的Datawhale打磨课。我们根据您的投票来确定精品课程的排期,打磨课程一旦完成&#xff…

常建的性能指标

1、响应时间响应时间指的是“系统响应时间”,定义为应用系统从发出请求开始到客户端接收到响应所消耗的时间。把它作为用户视角的软件性能的主要体现。它包括网络上的传输时间,web服务器上处理时间,APP服务器上处理时间,DB服务器上…

东野圭吾最值得看的书排行榜_东野圭吾最值得看的7本作品,我进了坑就再也没出来...

自从读了东野圭吾的《解忧杂货店》,我便一发不可收拾,成了这位日本推理大佬的脑残粉。 有的人说不清他哪里好,但就是想戒也戒不掉!读了东野圭吾几乎所有作品后,我盘点了「东野圭吾作品必读top 7」,拿去不谢—— 07《圣女的救济》 一场真正的“完美谋杀”! 男子在家中死亡…

【青少年编程】【四级】用逗号分隔列表

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100,小马老…

Console-算法-一个偶数总能表示为两个素数之和

ylbtech-Arithmetic:Console-算法-一个偶数总能表示为两个素数之和1.A,Demo(案例)【程序84】题目:一个偶数总能表示为两个素数之和。1.程序分析: 1.B,Solution(解决方案)【不太理解】using System;namespace ConsoleApplication1 …

day16-筛选器以及Tab菜单示例

一、前言 之前我们学习dom写Tab菜单示例&#xff0c;今天我们来学习一下常用的筛选器和Tab菜单示例。 二、操作的html <head><meta charset"UTF-8"><title>Title</title><style>.header{background-color: black;color: white;cursor:…

nginx和mysql链接_nginx转发mysql连接

场景&#xff1a;访问UAT环境&#xff0c;只能使用客户电脑访问&#xff0c;太难用了&#xff0c;于是就需要在自己电脑上跑代码&#xff0c;通过客户电脑中转来访问uat环境的数据库。选用nginx进行转发。配置如下&#xff1a;stream {upstream cloudsocket {hash $remote_addr…

两个有序单链表的并交差运算

/*实验2.6&#xff1a;求集合&#xff08;有序单链表表示&#xff09;的并、交和差运算*/ #include<iostream> #include<malloc.h> using namespace std; typedef char ElemType; typedef struct LNode {ElemType data;struct LNode *next; }LinkList; void Displa…

【青少年编程】【蓝桥杯】排队购票

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

Linux (CentOS 7 )下搭建局域网SVN服务器+SVN权限配置

准备 公司内部需要配置局域网SVN&#xff0c;需要在在内部虚拟机服务器搭建&#xff0c;搭建过程做个记录&#xff0c;供参考。注&#xff1a;如果条件允许&#xff0c;尽量在windows下搭建svn服务器&#xff0c;很省事&#xff0c;尤其是权限配置非常方便又易懂&#xff0c;效…

mysql事件探查器_【干货】Mysql的事件探查器-之Mysql-Proxy代理实战一(安装部署与实战sql拦截与性能监控)...

1:资料参考https://blog.csdn.net/coldljy/article/details/3168906https://www.cnblogs.com/jwentest/p/8552075.htmlhttps://www.cnblogs.com/ExMan/p/10396298.html一&#xff1a;原理Mysql-Proxy是一个处于你的client端和Mysql Server端之间的一个简单程序&#xff0c;它可…

【青少年编程】【蓝桥杯】绘制莲花图形

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

问题总结两天来两场实习面试(中科创达、华为)

查了好多资料&#xff0c;发现还是不全&#xff0c;干脆自己整理吧&#xff0c;至少证保在我的做法正确的&#xff0c;以免误导读者&#xff0c;也是给自己做个记录吧&#xff01; 昨天下午去的中科创达口试 今天下午刚刚结束为华的练习生口试&#xff0c;月五二号去上机试笔&a…

不想被问年终奖?2018年春节自救攻略来了!

转眼间,春节即将来临&#xff01;当然按捺不住那颗归家的心~但是想到回家&#xff0c;就要接受来自七大姑八大姨的亲切问候&#xff0c;美好的假期变得不怎么美好了&#xff0c;瞬间忧伤起来~对象难找、年终奖少&#xff0c;当被七姑八姨问起时&#xff0c;内心总会产生抵触情绪…

mysql complete_mysql 无意重启 [Note] /usr/sbin/mysqld: Normal shutdown

情况&#xff1a;今早发现&#xff0c;昨天下午安装的4台mysql服务器&#xff0c;突然出现&#xff0c;由于在shell窗口(rootlocalhost:mysql.sock) [(none)]> 190102 18:12:16 mysqld_safe mysqld from pid file /home/data/mysqldata/3306/data/mysql3.pid ended什么情况&…

redis 数据结构 内存管理 持久化

为什么80%的码农都做不了架构师&#xff1f;>>> Redis 内存数据结构与编码 OBJECT encoding key、DEBUG OBJECT key简单动态字符串&#xff08;simple dynamic string&#xff09;链表&#xff08;linked list&#xff09;字典&#xff08;dict&#xff09;跳表&am…

【青少年编程】【蓝桥杯】水仙花数

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

本地 无法启动 SQL Server 错误代码126

Windows 不能在 本地计算机 启动 SQL Server 。错误代码126. 2008 R2 配置工具 VIA设置禁用。 然后重启一下服务 转载于:https://www.cnblogs.com/wuxinyu/archive/2013/05/08/3068008.html

mysql 表的继承,MySQL是否支持表继承?

I have this code in PostgreSQLCREATE TABLE first (id serial,primary key(id));CREATE TABLE second (primary key(id)) INHERITS (first);What is the equivalent code for MySQL?解决方案MySQL does not support table inheritance. The only way to approximate the fun…

C#编程概念系列(一):面向对象编程

系列文章索引目录&#xff1a;http://www.cnblogs.com/loner/archive/2013/05/09/3068211.html 引子&#xff1a; 面向对象编程&#xff1a;这个在当下已不是什么时髦的概念&#xff0c;但通过自己的语言组织描述出来可能会有点意外的收获&#xff01; 记得最近看的乔布斯在199…

【青少年编程】【四级】数字反转

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

【对讲机的那点事】关于对讲机锂电池你了解多少?

在对讲机日常使用中&#xff0c;对讲机电池是属于损耗件&#xff0c;随着使用时间、频率的增加会减弱其使用性能&#xff1b; 锂离子聚合物电池成为领先的电池技术&#xff0c;它具有不容忽视的优势&#xff0c;但是你究竟对锂离子电池有多少了解呢&#xff1f; 较高的电能重量…

mac mysql5.7 my_【mysql】Mac下安装mysql5.7 完整步骤,大坑已解决

最近使用Mac系统&#xff0c;准备搭建一套本地web服务器环境。因为Mac系统自带PHP和apach&#xff0c;但是没有自带mysql&#xff0c;所以要手动去安装mysql&#xff0c;本次安装mysql最新版5.7.17。1.官网下载点击上面的地址&#xff0c;会看到如下图的页面。你可能不知道该下…

【数学基础】校招算法工程师笔试题

请留言&#xff0c;说出你的解题思路和答案。稍后&#xff0c;我会把参考答案发到留言区。不定期整理相关的问题答案分享。 1、下列矩阵的主元列为&#xff08;&#xff09; A[000111001123]A\begin{bmatrix}0&0&0&1\\1&1&0&0\\1&1&2&3\e…

IOS6.0 应用内直接下载程序 不需跳转AppStore

闲来没事看了篇文章 应用内创建应用商店环境&#xff0c;不跳转AppStore. 先武断的想一句&#xff1a;放屁。然后好奇的进去看看&#xff0c;原来是IOS6.0的新特性&#xff0c;顿感惭愧。研究下 SKStoreProductViewController类是UIViewController的子类, 如果你对view control…

python语言基础汇总

注释 代码中添加注释是一个良好的编程习惯&#xff0c;python语言的注释才用井号#作为注释开头的&#xff0c;可以是任意内容&#xff0c;解释器会忽略掉这部分内容。其他每一行都是语句&#xff0c;当语句以冒号:结尾时&#xff0c;缩进的语句视为代码块。 数据类型 python中有…

docker安装mysql5.7_超详细Docker安装Mysql5.7并进行挂载

1、下载mysql 5.7镜像docker pull mysql:5.72、创建mysql容器并启动docker run -d -p 3306:3306 -e MYSQL_USER"ppx" -e MYSQL_PASSWORD"123456" -e MYSQL_ROOT_PASSWORD"123456" --name mysqltest1 mysql:5.7 --character-set-serverutf8 --col…

SQL查询语句 select 详解

查询select: 1。单表查询 2。多表查询 3。嵌套查询分类 1&#xff09;单表查询 2&#xff09;多表查询 A.连接查询 B.子查询 ①一般子查询 ②相关子查询***************************************SQL查询语句《一》&#xff1a;单表查询1.查询全部记录&#xff1a;select * from…

【青少年编程】【蓝桥杯】绘制扇子

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…