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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

borderColor与CGColor/UIColor

發布時間:2023/12/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)

#if __has_attribute(objc_bridge) && __has_feature(objc_bridge_id) && __has_feature(objc_bridge_id_on_typedefs)#define CF_BRIDGED_TYPE(T) __attribute__((objc_bridge(T))) #else #define CF_BRIDGED_TYPE(T) #endif

__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 框架)所生成的。

比如:

Core FoundationFoundation
CFArrayRefNSArray
CFStringRefNSString

但是還有雖然是這種形式,卻不是Toll-Free Bridging的組合:

Core FoundationFoundation
CFRunLoopNSRunLoop

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三個對象聯系了起來。
所以可以這樣寫

UIColor *color = [UIColor whiteColor];NSLog(@"CGColor from UIColor %@", color.CGColor);NSLog(@"CIColor from UIColor %@", color.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的全部內容,希望文章能夠幫你解決所遇到的問題。

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