日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

setNeedsDisplay看我就懂!

發布時間:2023/11/29 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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看我就懂!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。