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 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相关推荐
- CGColor UIColor
文章参考: https://www.cnblogs.com/smileEvday/archive/2012/06/05/UIColor_CIColor_CGColor.html https://not ...
- 使用catagory类别给控件加边框
为什么80%的码农都做不了架构师?>>> 在项目中经常需要给view button 等 加边框 每次都要自己堆代码 感觉很费劲 self.addWayBtn.layer.bor ...
- iosxib 设置图片_iOS从Xib中设置样式
简介 iOS在写视图的有的人喜欢纯代码去写,从之前的绝对定位方式(Frame),到现在的自动布局(Autolayout),但这种方式的好处是便于复制修改和装X,但是缺点是代码不容易看,不便于修改 也有 ...
- iOS xib设置阴影
原理和xib中设置边框一样,我大概说一下流程.废话不多说,看图: 相当于代码: view.layer.shadowOffset = CGSizeMake(0, 5); view.layer.shado ...
- iOS UIColor,CGColor,CIColor三者的区别和联系
最近看了看CoreGraphics的东西,看到关于CGColor的东西,于是就想着顺便看看UIColor,CIColor,弄清楚它们之间的区别和联系.下面我们分别看看它们三个的概念: 一.UIColo ...
- UIColor,CGColor,CIColor三者的区别和联系
一.UIColor UIColor是UIKit中存储颜色信息的一个重要的类,一个UIColor对象包含了颜色和透明度的值,它的颜色空间已经针对IOS进行了优化.UIColor包含了一些类方法用于创建一 ...
- ios开发(二十一)UIColor,CGColor,CIColor三者的区别和联系
http://www.cnblogs.com/smileEvday/archive/2012/06/05/UIColor_CIColor_CGColor.html 最近看了看CoreGraphics的 ...
- UIColor延伸:判断两个颜色是否相等
不管UIColor使用CIColor,CGColor还是其他方式初始化的,其CGColor属性都是可用的.CoreGraphics中提供一个函数,用于判断两个CGColor是否相等,因此我们可以通过这 ...
- 颜色(二):CGColor
前言 CGColor主要用于CoreGraphics框架之中,CGColor其实是个结构体,而我们通常再使用CGColor的时候使用的是他的引用类CGColorRef.CGColor主要由CGColo ...
- UIColor的简单介绍
两个参数 一个是不透明度 一个是灰度值 返回的是一个颜色对象 两个值都是CGFloat类型 大于1按1算 小于0 按0算 和[[UIColor alloc]initWithWhite:0.33 al ...
最新文章
- python变量类型之间转换_Python变量赋值类型转换
- iOS 9音频应用播放音频之控制播放速度
- 网校mysql设计规范_网校数据库设计
- Vue中使用el-popover实现悬浮弹窗显示图片预览
- SharePoint 2010 工作流解决方案:将 SharePoint Designer 可重用工作流导入 Visual Studio...
- Spoken English(001)
- Java但中获取时间将时间转换成字符串格式(年月日格式)
- 语音支持英语_语音识别英语_英语语音评分 - 云+社区 - 腾讯云
- windows环境下安装wget
- 消费者反映鸡蛋难吃后的37种回答方法
- 数据库SQL语句之外键
- 企业微信接口下载微盘文件
- 硬脆材料划片机的工艺参数研究
- 【基于狂神Docker双响曲】:2、Docker进阶
- html图片显示详情,纯CSS鼠标经过图片视差弹出层显示详情链接按钮特效代码.html...
- 用java实现简单的银行管理系统
- 【沃顿商学院学习笔记】商业分析——Customer Analytics:01 描述性分析 Descriptive Analytics
- 多益面试题简答题和编程题解析
- 好用的字体图标插件:阿里图标库(iconfont)
- 最具价值和投资前景的域名系列之-SoShow(搜秀)