前言:

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可以让我们访问circleViewStepper。对于步进值的变化,有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之后添加了对setNeedsLayoutlayoutIfNeeded的调用,但结果同样不会更新。类似地,旋转设备也不会触发重新绘制圆形。这是因为视图的缓存机制,即便视图布局发生改变,也只是作为缓存。所以我们需要调用setNeedsDisplay,明确地告诉系统必须重新绘制,从而显示新的颜色 由此,我们需要考虑三个重要的原则:

1、在iOS中,视图很明显会被缓存。通常,给定的视图可能会被绘制一次,同时也不需要更新。 2、即使视图可能被移动或者有另一个视图重叠,也可能不需要重新绘制,因此您不能仅仅依靠已经移动整个视图或添加另一个视图基于setNeedsLayoutupdateIfNeeded来导致重绘 3、当编写重载drawRectUIView子类时,需要在需要重绘时指示给系统。因为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看我就懂!相关推荐

  1. 看完弄懂,明年至少加 5K

    看完弄懂,明年至少加 5K

  2. 使用网站模板快速建站_建站工具使用教程看了就懂网站建设

    做网站敲代码早已是过去式,使用建站工具制作网站以是主流,初次接触建站工具难免对它有所不了解,广州半岛网络科技有限公司就以"云建站"为使用案例,把操作建站过程梳理写成教程,方便大家看 ...

  3. 网络通过猫传输到计算机,网络直接从光猫出来好还是接个路由器再接入电脑好?看完搞懂了...

    网络直接从光猫出来好还是接个路由器再接入电脑好?看完搞懂了 宽带网络现在是家家户户不可缺少的"硬件"之一,现在即便是老一辈的人家中安装宽带都成了必需品.有些偏好用电脑来上网的朋友可 ...

  4. 看了必懂的并查集原理(转载)

    看了必懂的并查集原理(转载) 并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠 ...

  5. 高铁、动车到底啥区别?看完彻底懂了(组图)

    摘自:网易新闻 (原标题:高铁.动车到底啥区别?看完彻底懂了(组图)) 高铁与动车的区别到底在哪里?磁悬浮列车又是什么鬼?今天给你讲讲清楚! 高铁.动车到底啥区别?看完彻底懂了 一.普通列车与高铁钢轨 ...

  6. 华为mate10pro以后能上鸿蒙吗,华为Mate10和Mate10 Pro差别一览 怎么选看完就懂

    华为Mate10和Mate10 Pro差别一览 怎么选看完就懂上周五华为正式发布了今年的两款重磅旗舰Mate10和Mate10 Pro.与上代产品不同,此次Mate10系列的两款产品无论是在外观还是一 ...

  7. 新手入门,数控刀具上的代码怎么认?看完就懂了!

    新手入门,数控刀具上的代码怎么认?看完就懂了! 按照不同的刀具类型对刀具分组: 类别组1 xxyyy(铣刀类): 110 球面铣刀 (圆柱型铣刀,其后的字母y代表铣刀直径,以下略同) 120 立铣刀 ...

  8. 为什么会显示有人正在使用计算机,微信“对方正在输入”为什么有时出现?有时不出现?看完才懂了.....

    原标题:微信"对方正在输入"为什么有时出现?有时不出现?看完才懂了.. 生活中有很多美好的事情 手机电量满格 您的快递正在派送 换季衣服里翻出毛爷爷 与喜欢的人聊天显示" ...

  9. java开发用i5还是i7,i7比i5更强!为什么内行人都选i5而不选i7?看完瞬间懂了

    i7比i5更强!为什么内行人都选i5而不选i7?看完瞬间懂了 2020-11-19 11:18:08 4点赞 0收藏 0评论 许多人认为i7比i5更好,那么有什么好呢?让我们先看一下区别. i7使用四 ...

最新文章

  1. 两个线程如何交替执行,一个输出偶数一个输出奇数?
  2. 去中心化交易所前路明朗,基于EOS的去中心化交易所力拔头筹
  3. Oracle区分中文和英文,oracle中中英文段落划分实现
  4. fir.im Log Guru 正式开源,快速找到 iOS 应用无法安装的原因
  5. windows下Call to undefined function curl_init() error问题
  6. QuickStart系列:docker部署之Gitlab本地代码仓库
  7. axure中备注线_1分钟K线、日K线、月K线……不同周期的K线图到底有啥用?
  8. KEIL MDK access violation at 0x40021000 : no ‘read‘ permission的一种解决方法
  9. Homebrew 更换阿里云镜像源
  10. 汽车维保反欺诈系统的设计和算法应用
  11. Springboot集成Activiti7
  12. 网站换服务器会降权,网站更换IP地址,对SEO有什么影响?
  13. 〖四信智慧方案〗LoRa无线技术在输电监测中的应用
  14. keil的终极配色方案(提供配置文件)
  15. 施一公 谈英文论文写作
  16. 【Hulu独家面试宝典】助你决胜校招技术面
  17. mysql java配置文件_Mysql配置文件参数优化
  18. HTML入门零基础教程(四)
  19. ye lynn yama Loafer 已发送,请注意查收
  20. 计算机系统实验三——buflab(缓冲区实验)

热门文章

  1. 编写一个程序,实现将存放在AX和DX中的32位数据循环右移二进制数的4位。(DX存放高字节内容,AX存放低字节内容)
  2. English最俗语法大全
  3. 树莓派3b安装ubuntu mate(在有显示器前提下看)
  4. mysql 数据库设计规范_MYSQL数据库设计规范与原则
  5. 2013_chengdu_online
  6. Codeforce 189B——Counting Rhombi
  7. 6.824 Raft lesson4 2020(一)
  8. ffmpeg简单使用小记
  9. 排序(基本概念及分类,直接插入排序和希尔排序)
  10. C语言实现双向链表删除、插入、双向输出