尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

UIView和CALayer

UIView和CALayer
📅 发布时间:2026/7/15 14:11:55
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];

相关新闻

  • C++ Qt员工管理系统实战:MVC架构、SQLite与性能优化详解
  • Godot游戏开发:SQLite数据库集成与实战优化指南
  • FPD-Link III解串器DS90UB940N-Q1:汽车高速视频传输与MIPI CSI-2接口实战

最新新闻

  • 【小程序计算机毕业设计案例】基于 SpringBoot 小程序的知识点考核答题系统的设计与实现 在线练习打卡系统(程序+文档+讲解+定制)
  • MDK4 IDS隐身技术:幽灵模式和分片攻击绕过安全检测的实战技巧
  • AMD Ryzen SMUDebugTool:免费开源硬件调优终极指南
  • BiliBiliToolPro:一站式B站自动化管理终极解决方案
  • 解锁MobaXterm专业版:Python授权生成器深度解析与实战指南
  • 高效下载B站视频:Python工具助你轻松保存大会员4K内容

日新闻

  • 告别启动盘残留:用Diskpart彻底清除U盘EFI分区与恢复完整空间
  • 2026 年宜春诚信的塑料缠绕膜厂家哪个好,缠绕膜背后的秘密:你不知道的成本陷阱 - 领域鉴赏官
  • Arch ECS 入门指南:10分钟掌握C#高性能数据驱动架构

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号