- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
// do drawing here
CGContextRestoreGState(context);
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(context);
// do drawing here
UIGraphicsPopContext();
}
Questions: What is the difference between those methods? Which one is better to use? Are there some examples of proving one method better than other and vise versa?
Answer:UIGraphicsPushContext(context) pushes context onto a stack of CGContextRefs (making context the current drawing context), whereas CGContextSaveGState(context) pushes the current graphics state onto the stack of graphics states maintained by context. You should use UIGraphicsPushContext if you need to make a new CGContextRef the current drawing context, and you should use CGContextSaveGState when you're working with one graphics context and just want to save, for example: the current transform state, fill or stroke colors, etc.
在调用drawRect:方法之前,绘图系统创建了一个图形上下文(CGContext)。上下文包括大量信息,比如画笔颜色、文本颜色、当前字体、变形等。有时你可能想要修改上下文并使其恢复原样。举个例子,你现在有一个使用特定颜色绘制特定形状的函数。由于只能有一只画笔,因此在更改颜色后,就会影响调用函数的结果。为了避免这个副作用,你可以使用CGContextSaveGState和CGContextRestoreGState将上下文入栈和出栈。 请不要与看起来相似的UIGraphicsPushContext和UIGraphicsPopContext混淆。它们做的并不是同一件事。CGContextSaveGState记录上下文的当前状态。UIGraphicsPushContext更改当前上下文。以下是CGContextSaveGState的示例。
以下代码展示了一个常见的错误。
使用UIGraphicsPushContext并不能保存上下文的当前**状态**(画笔颜色、线条宽度等),而是完全切换上下文。假设你正在当前视图上下文中绘制什么东西,这时想要在位图上下文中绘制完全不同的东西。如果要使用UIKit来进行任意绘图,你会希望保存当前的UIKit上下文,包括所有已经绘制的内容,接着切换到一个全新的绘图上下文中。这就是UIGraphicsPushContext的功能。创建完位图后,再将你的旧上下文出栈。而这就是UIGraphicsPopContext的功能。这种情况只会在要使用UIKit在新的位图上下文中绘图时才会发生。只要你使用的是Core Graphics函数,就不需要去执行上下文入栈和出栈,因为Core Graphics函数将上下文视作参数。 这是极其有用的常见操作。因为其常用性,苹果公司为其创建了一个叫做UIGraphicsBeginImageContext的快捷方式。它负责将旧的上下文入栈、为新上下文分配内存、创建新的上下文、翻转坐标系统,并使其作为当前上下文使用。它替你完成了大部分的工作。 |
相关推荐
ASP某书店图书销售管理系统的设计与实现(源代码+论文)【ASP】
施工混凝土配合比动态管理台账(新样板版).xls
Lua移植到标准ANSI C环境
施工混凝土配合比动态管理台账.docx
TwinCAT3 入门教程 V4.11
【作品名称】:基于Python开发的快递管理系统-课程设计 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:使用Python开发的课程设计,快递管理系统。课程设计
信息化以它自身的优点,方便、快捷、进入了各行各业。教育行业也是如此。由于高校不断的扩大管理,教师人工管理已经越来越不能满足学校的需求。人工管理信息,管理纸质档案变成了落后的管理方式。不方便、难以保存、不容易查找这些种种缺点都督促着高校信息化的发展。高校对于教师工作采用信息管理系统是急需的。 本文从相关技术分析、系统需求分析、数据库需求分析确定了系统重要功能模块的实现。实现主要功能模块包括人员信息模块、评价教师模块、教师工作日程管理模块、科研信息申报模块等。 在Windows环境下,本管理信息系统使用visual studio开发工具。编写程序过程用到了Asp.Net技术。编写程序采用B/S架构,webform框架,连接数据库方式采用当下主流技术使用SQL Server。最后,通过多次反复的测试,确定各项功能实现的稳定性。
H3C实验概述及应用 一、实验概述 H3C实验是网络工程领域中的一项重要实践活动,旨在通过模拟或实际部署H3C网络设备,让学生或网络工程师深入了解H3C网络设备的配置、管理及应用。这些实验不仅有助于提升网络工程师的技术水平,还能够为企业的网络建设和管理提供有力支持。 H3C实验通常包括以下几个方面: 1.设备连接与基础配置:学习如何正确连接H3C网络设备,并进行基本的配置,如IP地址设置、VLAN划分等。 2.路由与交换技术:掌握H3C路由器和交换机的配置与管理,包括静态路由、动态路由协议(如OSPF、BGP等)、VLAN间路由等。 3.安全技术:了解H3C网络安全设备的配置与管理,如防火墙、VPN、入侵检测与防御等。 4.无线技术:熟悉H3C无线接入点(AP)和无线控制器的配置与管理,掌握WLAN网络的规划与部署。 5.网络管理与优化:学习使用H3C网络管理系统(如iMC)对网络设备进行监控、故障排查和性能优化。 二、实验应用 H3C实验在网络工程领域具有广泛的应用,以下是一些具体的应用场景: 1.教育培训:H3C实验是网络工程专业学生的重要实践课程,通过实验操作,学生能够更好地理解
php-[整站程序]三雷11种语言建站系统(网络版) v6.0_30tnetwork
VBA聚光灯效果工具箱.xlsm 跟wps聚光灯差不多 可设置聚光灯0.5毫秒消失,可以自定义设置时间
中国生物医药行业市场前景及投资研究报告
本资源深入解析了《啊哈算法》一书中的经典案例——第四节“再解炸弹人问题”,通过Java语言实现了BFS(广度优先搜索)算法的详细过程。本资源不仅涵盖了理论基础,详细阐述了BFS算法原理及其在解决“炸弹人”游戏策略中的应用,还提供了高质量的Java代码实现,每行代码均有详尽注释,便于读者理解和实践。无论是算法初学者想要掌握BFS算法精髓,还是有一定基础的开发者希望提升编程技巧,这份资料都能提供极大的帮助。立即下载,跟随教程一步步揭开“炸弹人”问题的面纱,提升你的算法思维与Java编程能力!
开车不犯困100首MP3,之51-60,DJ.rar
【思维模型】查理·芒格推荐的100个思维模型.pptx
Buffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Lar
跨国经营与管理第九章全球化企业的跨文化管理.pptx
一款苹果CMS8X高仿迅影网主题模板,已测试,完美无错。苹果cmsV8版本,只有电脑端,不自适应手机端。模板只包含首页、列表、内容页、播放页。
【学习目标】: 图片幻灯 复杂的表单验证 瀑布流
跨国经营与管理第十一章全球化企业营销管理.pptx
混凝土配合比试配砼计表.docx