当前位置: 首页 > news >正文

UIView和CALayer

1 两者关系

UIView来自UIKit框架,继承自UIResponder,可以响应和处理事件,CALayer来自QuartzCore框架,继承自NSObject,负责绘制和展示内容。
两者互相依赖,UIView负责管理CALayer,在add或remove时,将其layer进行对应的处理,是对CALayer的封装。
分离开来是为了单一职责,方便维护和拓展,在Mac OS 平台上,和UIView对应的是NSView,这样就实现了复用。

UIView的很多属性是依赖CALayer实现的,比如frame\bounds\center\alpha\clipsToBounds,最终调用了CALayer的frame\bounds\position\opacity\masksToBounds。而Layer的frame则依赖自身的anchorPotin、position、bounds和transform。

比如UIView的alpha、hidden的获取和设置,就是调用了CALayer的opacty和opaque。

内容的绘制

UIView是CALayer的delgate,可以实现代理来参与内容等绘制,CALayerDelegate有以下可选方法:

@protocol CALayerDelegate <NSObject> @optional - (void)displayLayer:(CALayer *)layer; - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx; - (void)layerWillDraw:(CALayer *)layer - (void)layoutSublayersOfLayer:(CALayer *)layer; - (nullable id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event;

通过实现这些方法,UIView也可以来绘制内容。
-[UIView setNeedsDisplay]方法会标记内容需要更新,在下一个绘制周期到来时,内容会进行更新。
-[CALayer display],会调用delegate(即UIView)的-[UIView displayLayer:]方法。如果未实现,则调用-[CALayer drawInContext: ]。
-[CALayer drawInContext: ]会调用delegate的-[UIView drawLayer:inContext:]方法。
而默认的-[UIView drawLayer:inContext:]方法会尝试调用-[UIView drawRect:]方法。
调用顺序如下,自上而下,如果上面的实现了,则后面的不会被调用。

-[UIView displayLayer:]-[UIView drawLayer:inContext:]-[UIView drawRect:]

如果UIView通过重写上面其中一个方法即可参与内容的绘制。
UIView有个contentMode的属性,当设置为UIViewContentModeRedraw时,如果更新bound,也会导致内容更新。

对于自定义的View,通常会重写layoutSubviews方法,在里面更新subview的位置,但这个方法不应该直接调用,而是调用-[UIView setNeedsLayout]或-[UIView layoutIfNeeded],等待系统来更新layout。
前者设置一个标记,等待runloop的下一个周期,进行更新。
后者看是否有更新标记,有则立刻更新,否则直接返回。
所有需要立即更新就这样调用:

-[UIView setNeedsLayout]; -[UIView layoutIfNeeded];
http://www.jsqmd.com/news/1194071/

相关文章:

  • Cursor AI 表单验证性能暴跌400%?揭秘AST解析层的隐式阻塞点及3行修复代码
  • TUSB8044A USB 3.2集线器芯片深度解析:从电路设计到寄存器配置实战
  • Tsukimi终极指南:3种简单方法快速安装这款Linux专属Jellyfin媒体播放器
  • 3层架构重构你的网络代理体系:nginx-proxy-manager-zh技术深度揭秘
  • 四点半海鲜烧烤大排档:本地海鲜大排档/酒馆/饭店,深耕烟台开发区等地区,深夜美食优选 - 十大品牌榜
  • 2026年吉林激光除锈哪家好?深挖本地寒地工况防腐施工实力榜单 - 资讯报道
  • Mac存储空间告急?3步彻底清理:智能卸载工具Pearcleaner让你的系统重获新生
  • 2026填报万博科技职业学院必备资料,内含官方电话、志愿流程与多项填报注意点 - 最新资讯
  • 2026长沙往返岳阳正规商务车拼车及联系电话汇总 - 资讯速览
  • FPD-Link III解串器DS90UB940N-Q1:汽车高速视频传输与MIPI CSI-2接口实战
  • Godot游戏开发:SQLite数据库集成与实战优化指南
  • 迪奥口红价格一览表背后藏着多少坑?14年源头工厂老板掏心窝子说真话
  • 终极免费音乐解锁工具:如何一键解密QQ音乐、网易云音乐等加密文件
  • 2026 天津河北区二手手表回收,劳力士浪琴欧米茄通收 - 奢侈品回收实体店
  • 免费大语言模型API革命:开发者如何打破AI访问壁垒
  • 终极Honey Select 2游戏体验升级指南:HS2-HF补丁完全解析
  • TCP与UDP协议在实时视频传输中的性能对比与实践
  • 2026年六盘水避暑酒店怎么选不踩雷?5家实测对比与高档住宿推荐 - 中国远见品牌企业资讯
  • FFmpeg —— AVDictionary打开不同媒体选项(涵盖网络流、usb摄像头、gdi桌面视频等媒体配置。附:打开媒体等超时回调处理)
  • 浪琴中国区官方售后服务中心|官方网站权威公示(2026年7月最新) - 浪琴中国服务中心
  • 如何在Kubernetes上部署Docker Time Machine备份服务器:完整指南
  • D2DX:如何让暗黑破坏神2在现代电脑上重获新生?三步实现高帧率宽屏体验
  • 如何通过zephyr-cn掌握Zephyr跨平台开发技巧:嵌入式开发的终极指南
  • 紧急!ChatGPT项目结项前72小时必须完成的3项合规动作(GDPR/《生成式AI服务管理暂行办法》双轨校验清单)
  • 从零开始搭建你的JimmyLv/jimmylv.github.io:详细部署与配置教程
  • Zpdf OCR:基于Tesseract的PDF图像文本识别与可搜索PDF生成实战
  • 计算机毕业设计之jsp校园勤工俭学兼职系统
  • 5分钟快速上手MCP协议:AI应用开发的终极连接器指南
  • 德阳黄金回收实用攻略|万达 / 天元 / 希望城 / 工农村正规门店盘点|2026 年 7 月15最新金价参考 - 不晚生活号
  • GPT 5.6 Luna、Terra、Sol 进企业之后:统一 AI API、团队 Key 与审计边界怎么设计