borderColor与CGColor/UIColor
CALayer CGColor
- 問題
- CGColor
- CGColor是個結構體:
- Toll-Free Bridging
- Objective-C 對象和 Core Foundation 對象
- Toll-Free Bridging
- CGColorRef
- CFType
- UIColor
- borderColor
- CALayer
- 為什么layer可以調整uibutton的外觀
- borderColor要使用CGColor而不能使用UIColor
- Clang Attribute
問題
這2個哪個是對的?
_btn.layer.borderColor = [[UIColor blackColor]CGColor]; _btn.layer.borderColor = [UIColor blackColor];CGColor
定義顏色的組件,通過顏色空間來解釋其顏色
它的引用類型CGColorRef
主要用于CoreGaphics框架之中
CGColor是個結構體:
typedef struct CF_BRIDGED_TYPE(id)
創建結構體:typedef struct
在CFBase.h中可以找到它到宏定義:
CF_BRIDGED_TYPE(id)
__has_attribute是Clang Attribute的表達式:表示編譯器滿足某種條件。
比如這里就是判斷滿足可以進行TFB(toll-free bridging)的編譯條件,如果滿足的話,那么用__attribute__((objc_bridge(NSString )))
去聲明這個結構體,表示CGColorRef和id滿足toll-free bridging。
代表CGColorRef和id可以交換使用
Toll-Free Bridging
蘋果文檔 Toll-Free Bridging
對自定義其內存管理語義的 collection 使用無縫橋接。
所謂的Toll-free bridging是說您可以在某個框架的方法或函數同時使用Core Foundatio和Foundation 框架中的某些類型。很多數據類型支持這一特性,其中包括群體和字符串數據類型。每個框架的類和類型描述都會對某個對象是否為 toll-free bridged,應和什么對象橋接進行說明。
在iOS世界,主要有兩種對象:Objective-C 對象和 Core Foundation 對象。
Objective-C 對象和 Core Foundation 對象
Objective -C 對象和 Core Foundation 對象的區別很小,不同之處只是在于由哪一個框架(Foundation框架還是Core Foundation 框架)所生成的。
比如:
| CFArrayRef | NSArray |
| CFStringRef | NSString |
但是還有雖然是這種形式,卻不是Toll-Free Bridging的組合:
| CFRunLoop | NSRunLoop |
Toll-Free Bridging
這兩種對象間可以互相轉換和操作,不使用ARC的時候,單純的用C原因的類型轉換,不需要消耗CPU的資源,所以叫做 Toll-Free bridged。
iOS之CF和OC之間類型轉換
CGColorRef
是一個常量的結構體__CGColor的指針
CGColorRef is derived from CFTypeRef and inherits the properties that all Core Foundation types have in common.
CGColorRef派生自CFTypeRef并繼承所有Core Foundation類型共有的屬性。
CFType
該類型是Core Foundation中定義的基本類型。充當其真正的Core Foundation對象的占位符
UIColor
@interface UIColor : NSObject
是UIKit中存儲顏色信息的一個重要的類。
UIColor還有兩個重要的屬性:一個是CGColor,一個是CIColor。
這兩個屬性就可以把UIColor,CGColor,CIColor三個對象聯系了起來。
所以可以這樣寫
borderColor
@property(nullable) CGColorRef borderColor;
它是CGColorRef類型的。
CALayer
@property(nonatomic,readonly,strong) CALayer *layer;CALayer是定義在QuartzCore框架中的
QuartzCore框架和CoreGraphics框架是可以跨平臺使用的,在iOS和Mac OS X上都能使用
為了保證可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef
為什么layer可以調整uibutton的外觀
UIView之所以能顯示在屏幕上,完全是因為它內部的一個圖層
在創建UIView對象時,UIView內部會自動創建一個圖層(即CALayer對象),通過UIView的layer屬性可以訪問這個層
當UIView需要顯示到屏幕上時,會調用drawRect:方法進行繪圖,并且會將所有內容繪制在自己的圖層上,繪圖完畢后,系統會將圖層拷貝到屏幕上,于是就完成了UIView的顯示
換句話說,UIView本身不具備顯示的功能,是它內部的層才有顯示功能
因此,通過操作CALayer對象,可以很方便地調整UIView的一些外觀屬性
詳細可見這篇博客:
CALayer_雪龍
borderColor要使用CGColor而不能使用UIColor
CALayer sits at a lower technical level than UIButton, which means it doesn’t understand what a UIColor is. UIButton knows what a UIColor is because they are both at the same technical level, but CALayer is below UIButton, so UIColor is a mystery.
CALayer的技術水平比UIButton低,這意味著它不理解UIColor是什么。UIButton知道UIColor是什么因為它們都在相同的技術水平,但是CALayer在UIButton之下,所以UIColor是一個謎。
CGColor存在于較為底層的CoreGraphics框架中,它是一個結構體
UIColor存在于相對CoreGraphics框架較高的UIKit框架中,他是一個類
CoreGraphics框架是可以跨平臺使用的
UIKit框架僅限于iOS
為了保證移植性以及框架的統一性,不能互用
Clang Attribute
Clang Attributes是Clang提供的一種注解,開發者用于向編譯器表達某種要求。
__attribute__((xxx)) objc_subclassing_restricted 子類不能繼承 objc_requires_super 必須調用父類實現 objc_boxable 語法糖 constructor / destructor 構造器和析構器(構造器 在load方法后,main方法前,即類加載進內存,但未執行入口方法時) overloadable 函數重載 objc_runtime_name 運行時改名字(采用映射時需特別注意) unavailable("alloc方法不可用,請用initWithName:")Clang提供的源碼注解__attribute__
總結
以上是生活随笔為你收集整理的borderColor与CGColor/UIColor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者战力查询教程,每天可查,数据准确~
- 下一篇: GAE的使用