网站关键词标签,火烈鸟门户网站开发,推广平台免费,给城市建设提议献策的网站前言#xff1a; setNeedsDisplay异步执行的。它会自动调用drawRect方法#xff0c;这样可以拿到 UIGraphicsGetCurrentContext#xff0c;就可以绘制了。而setNeedsLayout会默认调用layoutSubViews#xff0c;处理子视图中的一些数据。 一、着手 我定义了一个UIView的子类… 前言 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之后添加了对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()}
}
复制代码这样就能显示了希望大伙能多敲多体会。 效果如下