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。

代表CGColorRefid可以交换使用

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 Foundation Foundation
CFArrayRef NSArray
CFStringRef NSString

但是还有虽然是这种形式,却不是Toll-Free Bridging的组合:

Core Foundation Foundation
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三个对象联系了起来。
所以可以这样写

    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相关推荐

  1. CGColor UIColor

    文章参考: https://www.cnblogs.com/smileEvday/archive/2012/06/05/UIColor_CIColor_CGColor.html https://not ...

  2. 使用catagory类别给控件加边框

    为什么80%的码农都做不了架构师?>>>    在项目中经常需要给view button 等 加边框 每次都要自己堆代码 感觉很费劲 self.addWayBtn.layer.bor ...

  3. iosxib 设置图片_iOS从Xib中设置样式

    简介 iOS在写视图的有的人喜欢纯代码去写,从之前的绝对定位方式(Frame),到现在的自动布局(Autolayout),但这种方式的好处是便于复制修改和装X,但是缺点是代码不容易看,不便于修改 也有 ...

  4. iOS xib设置阴影

    原理和xib中设置边框一样,我大概说一下流程.废话不多说,看图: 相当于代码: view.layer.shadowOffset = CGSizeMake(0, 5); view.layer.shado ...

  5. iOS UIColor,CGColor,CIColor三者的区别和联系

    最近看了看CoreGraphics的东西,看到关于CGColor的东西,于是就想着顺便看看UIColor,CIColor,弄清楚它们之间的区别和联系.下面我们分别看看它们三个的概念: 一.UIColo ...

  6. UIColor,CGColor,CIColor三者的区别和联系

    一.UIColor UIColor是UIKit中存储颜色信息的一个重要的类,一个UIColor对象包含了颜色和透明度的值,它的颜色空间已经针对IOS进行了优化.UIColor包含了一些类方法用于创建一 ...

  7. ios开发(二十一)UIColor,CGColor,CIColor三者的区别和联系

    http://www.cnblogs.com/smileEvday/archive/2012/06/05/UIColor_CIColor_CGColor.html 最近看了看CoreGraphics的 ...

  8. UIColor延伸:判断两个颜色是否相等

    不管UIColor使用CIColor,CGColor还是其他方式初始化的,其CGColor属性都是可用的.CoreGraphics中提供一个函数,用于判断两个CGColor是否相等,因此我们可以通过这 ...

  9. 颜色(二):CGColor

    前言 CGColor主要用于CoreGraphics框架之中,CGColor其实是个结构体,而我们通常再使用CGColor的时候使用的是他的引用类CGColorRef.CGColor主要由CGColo ...

  10. UIColor的简单介绍

    两个参数 一个是不透明度 一个是灰度值 返回的是一个颜色对象 两个值都是CGFloat类型 大于1按1算  小于0 按0算 和[[UIColor alloc]initWithWhite:0.33 al ...

最新文章

  1. python变量类型之间转换_Python变量赋值类型转换
  2. iOS 9音频应用播放音频之控制播放速度
  3. 网校mysql设计规范_网校数据库设计
  4. Vue中使用el-popover实现悬浮弹窗显示图片预览
  5. SharePoint 2010 工作流解决方案:将 SharePoint Designer 可重用工作流导入 Visual Studio...
  6. Spoken English(001)
  7. Java但中获取时间将时间转换成字符串格式(年月日格式)
  8. 语音支持英语_语音识别英语_英语语音评分 - 云+社区 - 腾讯云
  9. windows环境下安装wget
  10. 消费者反映鸡蛋难吃后的37种回答方法
  11. 数据库SQL语句之外键
  12. 企业微信接口下载微盘文件
  13. 硬脆材料划片机的工艺参数研究
  14. 【基于狂神Docker双响曲】:2、Docker进阶
  15. html图片显示详情,纯CSS鼠标经过图片视差弹出层显示详情链接按钮特效代码.html...
  16. 用java实现简单的银行管理系统
  17. 【沃顿商学院学习笔记】商业分析——Customer Analytics:01 描述性分析 Descriptive Analytics
  18. 多益面试题简答题和编程题解析
  19. 好用的字体图标插件:阿里图标库(iconfont)
  20. 最具价值和投资前景的域名系列之-SoShow(搜秀)

热门文章

  1. kinect游戏下载
  2. 《JavaScript》条件运算符
  3. 基于GAN的动漫头像生成
  4. mybatis 小于号转义
  5. 股票涨跌和买卖预测计算公式
  6. JPEG 原理分析及 JPEG 解码器的调试
  7. 3.用Python爬虫,2003-2021的双色球数据
  8. 5角星画法 android,Android Canvas绘制正多边形和正多角星
  9. amd raid linux驱动,AMD 磁盘阵列控制器 驱动程序下载——更新 AMD 软件
  10. Android知识点 363 —— dumpsys alarm