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可以讓我們訪問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()}
}
復制代碼

這樣就能顯示了,希望大伙能多敲,多體會。 效果如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391658.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391658.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391658.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用ArchUnit測試Java項目的體系結構

by Emre Savc?由EmreSavc? 如何使用ArchUnit測試Java項目的體系結構 (How to test your Java project’s architecture with ArchUnit) In this post, I will show you an interesting library called ArchUnit that I met recently. It does not test your code flow or bu…

解決ionic3 android 運行出現Application Error - The connection to the server was unsuccessful

在真機上啟動ionic3打包成的android APK,啟動了很久結果彈出這個問題: Application Error - The connection to the server was unsuccessful 可能是我項目資源太多東西了,啟動的時間太久了,導致超時了。 解決方案是在項目目錄下的config.xml…

特征工程之特征選擇_特征工程與特征選擇

特征工程之特征選擇📈Python金融系列 (📈Python for finance series) Warning: There is no magical formula or Holy Grail here, though a new world might open the door for you.警告 : 這里沒有神奇的配方或圣杯,盡管新世界可…

搭建Harbor企業級docker倉庫

https://www.cnblogs.com/pangguoping/p/7650014.html 轉載于:https://www.cnblogs.com/gcgc/p/11377461.html

leetcode 131. 分割回文串(dp+回溯)

給你一個字符串 s,請你將 s 分割成一些子串,使每個子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正著讀和反著讀都一樣的字符串。 示例 1: 輸入:s “aab” 輸出:[[“a”,“a”,“b”],[“aa”,“b”]]…

[翻譯練習] 對視圖控制器壓入導航棧進行測試

譯自:swiftandpainless.com/testing-pus… 上個月我寫的關于使用 Swift 進行測試驅動開發的書終于出版了,我會在本文和接下來的一些博文中介紹這本書撰寫過程中的一些心得和體會。 在本文中,我將會展示一種很好的用來測試一個視圖控制器是否因…

python多人游戲服務器_Python在線多人游戲開發教程

python多人游戲服務器This Python online game tutorial from Tech with Tim will show you how to code a scaleable multiplayer game with python using sockets/networking and pygame. You will learn how to deploy your game so that people anywhere around the world …

版本號控制-GitHub

前面幾篇文章。我們介紹了Git的基本使用方法及Gitserver的搭建。本篇文章來學習一下怎樣使用GitHub。GitHub是開源的代碼庫以及版本號控制庫,是眼下使用網絡上使用最為廣泛的服務,GitHub能夠托管各種Git庫。首先我們須要注冊一個GitHub賬號,打…

leetcode132. 分割回文串 II(dp)

給你一個字符串 s,請你將 s 分割成一些子串,使每個子串都是回文。 返回符合要求的 最少分割次數 。 示例 1: 輸入:s “aab” 輸出:1 解釋:只需一次分割就可將 s 分割成 [“aa”,“b”] 這樣兩個回文子串…

數據標準化和離散化

在某些比較和評價的指標處理中經常需要去除數據的單位限制,將其轉化為無量綱的純數值,便于不同單位或量級的指標能夠進行比較和加權。因此需要通過一定的方法進行數據標準化,將數據按比例縮放,使之落入一個小的特定區間。 一、標準…

熊貓tv新功能介紹_熊貓簡單介紹

熊貓tv新功能介紹Out of all technologies that is introduced in Data Analysis, Pandas is one of the most popular and widely used library.在Data Analysis引入的所有技術中,P andas是最受歡迎和使用最廣泛的庫之一。 So what are we going to cover :那么我…

關于sublime-text-2的Package Control組件安裝方法,自動和手動

之前在自己的文章《Linux下安裝以及破解sublim-text-2編輯器》的文章中提到過關于sublime-text-2的Package Control組件安裝方法。 當時使用的是粘貼代碼: 1import urllib2,os;pfPackage Control.sublime-package;ippsublime.installed_packages_path();os.makedirs…

上海區塊鏈會議演講ppt_進行第一次會議演講的完整指南

上海區塊鏈會議演講pptConferences can be stressful even if you are not giving a talk. On the other hand, speaking can really boost your career, help you network, allow you to travel for (almost) free, and give back to others at the same time.即使您不講話…

windows下Call to undefined function curl_init() error問題

本地項目中使用到curl_init()時出現Call to undefined function curl_init()的錯誤,去掉php.ini中的extensionphp_curl.dll前的分號還是不行,phpinfo()中無curl模塊,于是上網搜索并實踐了如下方法,成功: 在使用php5的c…

數據轉換軟件_數據轉換

數據轉換軟件📈Python金融系列 (📈Python for finance series) Warning: There is no magical formula or Holy Grail here, though a new world might open the door for you.警告 :這里沒有神奇的配方或圣杯,盡管新世界可能為您…

leetcode 1047. 刪除字符串中的所有相鄰重復項(棧)

給出由小寫字母組成的字符串 S,重復項刪除操作會選擇兩個相鄰且相同的字母,并刪除它們。 在 S 上反復執行重復項刪除操作,直到無法繼續刪除。 在完成所有重復項刪除操作后返回最終的字符串。答案保證唯一。 示例: 輸入&#x…

spring boot: spring Aware的目的是為了讓Bean獲得Spring容器的服務

Spring Aware的目的是為了讓Bean獲得Spring容器的服務 //獲取容器中的bean名稱import org.springframework.beans.factory.BeanNameAware;//獲得資源加載器,可以獲得額外的資源import org.springframework.context.ResourceLoaderAware; package ch2.aware; import …

10張圖帶你深入理解Docker容器和鏡像

【編者的話】本文用圖文并茂的方式介紹了容器、鏡像的區別和Docker每個命令后面的技術細節,能夠很好的幫助讀者深入理解Docker。這篇文章希望能夠幫助讀者深入理解Docker的命令,還有容器(container)和鏡像(image&#…

matlab界area_Matlab的數據科學界

matlab界area意見 (Opinion) My personal interest in Data Science spans back to 2011. I was learning more about Economies and wanted to experiment with some of the ‘classic’ theories and whilst many of them held ground, at a micro level, many were also pur…

javascript異步_JavaScript異步并在循環中等待

javascript異步Basic async and await is simple. Things get a bit more complicated when you try to use await in loops.基本的async和await很簡單。 當您嘗試在循環中使用await時,事情會變得更加復雜。 In this article, I want to share some gotchas to wat…