setNeedsDisplay看我就懂!
前言:
setNeedsDisplay
异步执行的。它会自动调用drawRect
方法,这样可以拿到UIGraphicsGetCurrentContext
,就可以绘制了。而setNeedsLayout
会默认调用layoutSubViews
,处理子视图中的一些数据。
一、着手
我定义了一个UIView的子类,用于演示使用setNeedsDisplay
,这个CircleView
子类会在draw(_ rect: CGRect)
方法内简单绘制一个圆,它有一个颜色属性,这是我们将要设置用来改变圆的颜色。
import UIKitclass CircleView: UIView {var color:UIColor = UIColor.redoverride func draw(_ rect: CGRect) {let path = UIBezierPath(ovalIn: rect)color.setFill()path.fill()}}
复制代码
注意: setNeedsDisplayInRect
相当于setNeedsDisplay
,除了它是指定视图的特定矩形区域更新,而不是整个视图需要显示。
二、配置属性、组件
应用程序的下一部分是在故事板中配置一些UIKit组件,其中一个是CircleView
。
为了允许用户更改颜色,我已经定义了UIStepper
控件,我还添加一个按钮,这将导致要使用的步进值来调整CircleView
的颜色值。我不会详细介绍如何配置storyboard,因为重点是了解setNeedsDisplay
@IBOutlet weak var stepper: UIStepper! //change value,default value is 120.
@IBOutlet weak var circleView: CircleView!
复制代码
IBOutlets可以让我们访问circleView
,Stepper
。对于步进值的变化,有IBActions,最后,有一个colorChangeBtn
,它将调用一个未定义的方法changeColorFromStppers
方法。该方法将收集步进器的值,使用它创建一个UIColor,并设置circleView
的color属性。
func changeColorFromStppers() {let valueFloat = CGFloat(stepper.value)let color = UIColor(red:valueFloat/255.0, green:valueFloat/255.0, blue:valueFloat/255.0, alpha:1.0)circleView.color = color}复制代码
在viewDidLoad中,根据故事板中配置的步进器的默认值,我触发了一组初始的圆形颜色。该changeColorFromStppers
方法创建CGFloat
的用于步进数的值,创建的UIColor
,然后设置circleView.color
。
override func viewDidLoad() {super.viewDidLoad()self.changeColorFromStppers()}
复制代码
三、思考
现在更改stepper的值,然后点击colorChangeBtn
按钮,发现圆形颜色没更新,这是什么原因呢?
一般来说,使用框架控件,当您设置属性(如显示标签或值)时,您将会使用该属性,这样会导致重新绘制控件,因为系统会实现对控件
drawRect
方法的调用。而我们自定义了自己的UIView子类,所以我们需要处理影响显示的控件的更新。在改变颜色的情况下,当然需要我们自己控制重新绘制。
根据上一篇文章setNeedsLayout和layoutIfNeeded看我就懂,所以我们在circleView.color = color
之后添加了对setNeedsLayout
或layoutIfNeeded
的调用,但结果同样不会更新。类似地,旋转设备也不会触发重新绘制圆形。这是因为视图的缓存机制,即便视图布局发生改变,也只是作为缓存。所以我们需要调用setNeedsDisplay
,明确地告诉系统必须重新绘制,从而显示新的颜色 由此,我们需要考虑三个重要的原则:
1、在iOS中,视图很明显会被缓存。通常,给定的视图可能会被绘制一次,同时也不需要更新。 2、即使视图可能被移动或者有另一个视图重叠,也可能不需要重新绘制,因此您不能仅仅依靠已经移动整个视图或添加另一个视图基于
setNeedsLayout
或updateIfNeeded
来导致重绘 3、当编写重载drawRect
的UIView
子类时,需要在需要重绘时指示给系统。因为drawRect
不能被手动调用,所以您需要使用setNeedsDisplay
方法告诉系统完成绘图,
四、添加setNeedsDisplay
所以接下来,我们需要添加setNeedsDisplay()
,有两种方法
- 在
changeColorFromStppers
添加 完整代码如下:
func changeColorFromStppers() {let valueFloat = CGFloat(stepper.value)let color = UIColor(red:valueFloat/255.0, green:100/255.0, blue:valueFloat/255.0, alpha:1.0)circleView.color = color//告诉系统需要重绘(Tell the system that circleView needs a redraw)circleView.setNeedsDisplay()
}
复制代码
- 在
CircleView
使用didSet
属性观擦器 代码完整如下:
class CircleView: UIView {var color:UIColor = UIColor.red {didSet {setNeedsDisplay() //告诉系统重绘界面}}override func draw(_ rect: CGRect) {let path = UIBezierPath(ovalIn: rect)color.setFill()path.fill()}
}
复制代码
这样就能显示了,希望大伙能多敲,多体会。 效果如下:
setNeedsDisplay看我就懂!相关推荐
- 看完弄懂,明年至少加 5K
看完弄懂,明年至少加 5K
- 使用网站模板快速建站_建站工具使用教程看了就懂网站建设
做网站敲代码早已是过去式,使用建站工具制作网站以是主流,初次接触建站工具难免对它有所不了解,广州半岛网络科技有限公司就以"云建站"为使用案例,把操作建站过程梳理写成教程,方便大家看 ...
- 网络通过猫传输到计算机,网络直接从光猫出来好还是接个路由器再接入电脑好?看完搞懂了...
网络直接从光猫出来好还是接个路由器再接入电脑好?看完搞懂了 宽带网络现在是家家户户不可缺少的"硬件"之一,现在即便是老一辈的人家中安装宽带都成了必需品.有些偏好用电脑来上网的朋友可 ...
- 看了必懂的并查集原理(转载)
看了必懂的并查集原理(转载) 并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠 ...
- 高铁、动车到底啥区别?看完彻底懂了(组图)
摘自:网易新闻 (原标题:高铁.动车到底啥区别?看完彻底懂了(组图)) 高铁与动车的区别到底在哪里?磁悬浮列车又是什么鬼?今天给你讲讲清楚! 高铁.动车到底啥区别?看完彻底懂了 一.普通列车与高铁钢轨 ...
- 华为mate10pro以后能上鸿蒙吗,华为Mate10和Mate10 Pro差别一览 怎么选看完就懂
华为Mate10和Mate10 Pro差别一览 怎么选看完就懂上周五华为正式发布了今年的两款重磅旗舰Mate10和Mate10 Pro.与上代产品不同,此次Mate10系列的两款产品无论是在外观还是一 ...
- 新手入门,数控刀具上的代码怎么认?看完就懂了!
新手入门,数控刀具上的代码怎么认?看完就懂了! 按照不同的刀具类型对刀具分组: 类别组1 xxyyy(铣刀类): 110 球面铣刀 (圆柱型铣刀,其后的字母y代表铣刀直径,以下略同) 120 立铣刀 ...
- 为什么会显示有人正在使用计算机,微信“对方正在输入”为什么有时出现?有时不出现?看完才懂了.....
原标题:微信"对方正在输入"为什么有时出现?有时不出现?看完才懂了.. 生活中有很多美好的事情 手机电量满格 您的快递正在派送 换季衣服里翻出毛爷爷 与喜欢的人聊天显示" ...
- java开发用i5还是i7,i7比i5更强!为什么内行人都选i5而不选i7?看完瞬间懂了
i7比i5更强!为什么内行人都选i5而不选i7?看完瞬间懂了 2020-11-19 11:18:08 4点赞 0收藏 0评论 许多人认为i7比i5更好,那么有什么好呢?让我们先看一下区别. i7使用四 ...
最新文章
- 两个线程如何交替执行,一个输出偶数一个输出奇数?
- 去中心化交易所前路明朗,基于EOS的去中心化交易所力拔头筹
- Oracle区分中文和英文,oracle中中英文段落划分实现
- fir.im Log Guru 正式开源,快速找到 iOS 应用无法安装的原因
- windows下Call to undefined function curl_init() error问题
- QuickStart系列:docker部署之Gitlab本地代码仓库
- axure中备注线_1分钟K线、日K线、月K线……不同周期的K线图到底有啥用?
- KEIL MDK access violation at 0x40021000 : no ‘read‘ permission的一种解决方法
- Homebrew 更换阿里云镜像源
- 汽车维保反欺诈系统的设计和算法应用
- Springboot集成Activiti7
- 网站换服务器会降权,网站更换IP地址,对SEO有什么影响?
- 〖四信智慧方案〗LoRa无线技术在输电监测中的应用
- keil的终极配色方案(提供配置文件)
- 施一公 谈英文论文写作
- 【Hulu独家面试宝典】助你决胜校招技术面
- mysql java配置文件_Mysql配置文件参数优化
- HTML入门零基础教程(四)
- ye lynn yama Loafer 已发送,请注意查收
- 计算机系统实验三——buflab(缓冲区实验)
热门文章
- 编写一个程序,实现将存放在AX和DX中的32位数据循环右移二进制数的4位。(DX存放高字节内容,AX存放低字节内容)
- English最俗语法大全
- 树莓派3b安装ubuntu mate(在有显示器前提下看)
- mysql 数据库设计规范_MYSQL数据库设计规范与原则
- 2013_chengdu_online
- Codeforce 189B——Counting Rhombi
- 6.824 Raft lesson4 2020(一)
- ffmpeg简单使用小记
- 排序(基本概念及分类,直接插入排序和希尔排序)
- C语言实现双向链表删除、插入、双向输出