如何从 UIView 创建 CGLayer 进行离屏绘图

2024-01-12

我已经阅读了我认为是 Quartz 2D 编程指南的相关部分,但找不到以下内容的答案(他们似乎在文档中没有过多谈论 iOS):

我的应用程序在UIView。我时不时地必须以某种方式更新绘图,例如更改其中一个形状的填充颜色(我保留CGPathRefs到重要的形状,以便稍后能够使用不同的填充颜色重新绘制它们)。正如上述文档第 169 页的“使用 CGLayer 绘图”部分所述,我正在考虑将整个绘图绘制成CGContext我将从中获得CGLayer,像这样:

CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer);

然后我可以在屏幕外进行更新CGContext并画出CGLayer进入我的 UIView 中UIView的drawRect:方法,像这样:

CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer);

我遇到的问题是,我从哪里得到我的CGLayer从?我的理解是我必须使用CGLayerCreateWithContext并提供一个CGContext作为一个参数,它继承了它的大部分属性。显然,正确的上下文是UIView,我正在接受

CGContextRef viewContext = UIGraphicsGetCurrentContext();

但如果我没记错的话,我只能在drawRect: 方法,并且假设下次调用该方法时给定的上下文将与我给出的上下文相同是无效的,即我只能使用该上下文CGContext本地方法内。

那么,我怎样才能获得CGContext我可以用它来初始化我的CGLayer创建一个离屏CGContext绘制然后将整个图层绘制回我的UIView's CGContext?

PS:当你在做的时候;如果以上任何内容没有意义或不理智,请告诉我。我刚刚开始了解 Quartz 2D。


首先,如果您是在 iOS 环境中执行此操作,我认为您是对的。该文档明确指出,获得CGContextRef is by

CGContextRef ctx = UIGraphicGetCurrentContext();

然后您使用该上下文来创建CGLayer with

CGLayerRef layer = CGLayerCreateWithContext(ctx, (CGSize){0,0}, NULL);

如果您想在该图层上绘制,则必须使用从该图层获得的上下文来绘制它。 (它与您之前创建 CGLayer 时传入的上下文有些不同)。我猜测CGLayerCreateWithContext保存它可以从传入的上下文中获取的信息,但不是所有信息。 (示例之一是 ColorSpace 信息,当您使用上下文填充某些内容时,必须重新指定CGLayer).

您可以从以下位置获取 CGLayer 上下文引用CGLayerGetContext()函数并用它来绘图。

CGContextRef layerCtx = CGLayerGetContext(layer);
CGContextBeginPath(layerCtx);
CGContextMoveToPoint(layerCtx, -10, 10);
CGContextAddLineToPoint(layerCtx, 100, 10);
CGContextAddLineToPoint(layerCtx, 100, 100);
CGContextClosePath(layerCtx);

我发现的一点是,当您在屏幕外绘制某些内容时,它会自动将其剪辑到屏幕外。 (有道理,所以它不会绘制看不见的东西)但是当您移动图层时(使用矩阵变换)。剪切路径未显示(丢失)。

最后一件事,如果将对图层的引用保存到变量中,稍后想要绘制它,则可以使用CGContextDrawLayerAtPoint()方法就像

CGContextDrawLayerAtPoint(ctx, (CGPoint) {newPointX, newPointY}, layer);

它将在该 newPointX 和新 PointY 坐标处“标记”或“绘制”图层。

我希望能回答您的问题,如果没有请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 UIView 创建 CGLayer 进行离屏绘图 的相关文章

  • 在 iPhone 中缝合图片

    我想并排缝合2张png 在Cocoa中 我会使用 NSImage initWithSize 然后只是drawInRect 但是 UIImage 没有 initWithSize 类 我现在该怎么做 Use UIGraphicsBeginIma
  • 水平 UICollectionView 单行布局

    我正在尝试使用以下命令设置简单的水平布局UICollectionView 兜圈子却没有达到预期的结果 所以任何指针或例子将不胜感激 我粘贴经常更改的代码但没有成功可能没什么意义 该图像显示两行 第一行是单个项目 尺寸正确并且在中心正确对齐
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • UIView晃动动画

    我试图在按下按钮时使 UIView 摇动 我正在调整我找到的代码http www cimgf com 2008 02 27 core animation tutorial window shake effect http www cimgf
  • 当 isUserInteractionEnabled false 时,SKSpriteNode 不会让触摸通过

    我正在尝试在 SpriteKit 中创建一个覆盖层 方法是使用SKSpriteNode 但是 我希望触摸穿过覆盖层 所以我设置isUserInteractionEnabled为假 然而 当我这样做时 SKSpriteNode似乎仍然吸收所有
  • 无法在 ios 应用程序中通过 googlecast 正确投射视频

    我正在开发一个基于 AVPlayer 的自定义视频播放器项目 尝试整合谷歌演员 我已经根据谷歌图进行了集成 https codelabs developers google com codelabs cast videos ios http
  • 如何使用 CNContacts 快速获取手机号码?

    我有一些代码可以检索用户联系人中的所有电话号码 但只想过滤掉手机号码 目前 我只是通过将第一个数字为 或第二个数字为 7 的数字添加到数组中来实现此目的 如下所示 func findContacts gt CNContact let key
  • 错误消息:您输入的捆绑包 ID 已被使用

    我正在尝试发布一个 iPhone 应用程序 这不是第一个 我过去已经发表过其他的 因此 我在第一个和第二个表单中输入了所需的信息 然后填写了第三个大表单 您还可以在其中上传图标和屏幕截图 好吧 我在上传屏幕截图之前按下了 保存 按钮 因为我
  • iPhone X 将对象底部与安全区域对齐会破坏其他设备上的外观

    关于 iPhone X 自动布局怪癖的问题 我有两个按钮 以前这些按钮将与超级视图底部对齐 偏移量为 20 以免它们接触屏幕底部 此后我将链接更改为安全区域而不是超级视图 Here s the original setup Looks go
  • Xamarin - 错误:dsymutil 退出,代码为 72

    最近升级到 VS for Mac 8 10 21 在构建应用程序时 我得到 Xamarin Shared targets 3 3 Error dsymutil exited with code 72 这是 Xcode 13 3 的情况 完整
  • UIViewController 不旋转到横向

    在许多情况下需要旋转控制器但不起作用 现在我遇到了相反的问题 它正在旋转 我想禁用它 在那个 ViewController 中我有这个 BOOL shouldAutorotateToInterfaceOrientation UIInterf
  • Swift:长按手势识别器 - 检测轻击和长按

    我想连接一个动作 如果手势是点击 它会以特定的方式为对象设置动画 但如果按下持续时间超过 0 5 秒 它会执行其他操作 现在 我刚刚连接了动画 我不知道如何区分长按和点击 如何访问新闻持续时间以实现上述目的 IBAction func ta
  • iOS 7 tabBar 横线,如何去掉?

    Apple 在 iOS 7 中的 tabBar 上添加了一条细线 该线应该在 tabBar 和 UI 之间起到阴影或淡入淡出的作用 由于我使用的是定制的 tabBar 这条线非常令人恼火 你如何删除它 请告诉我这是可能的 否则我需要重新设计
  • CATextLayer 上 iOS 6 中不需要的垂直填充

    背景 我在 iOS 5 中开始了我的项目 并构建了一个带有图层的漂亮按钮 我在按钮上添加了一个 textLayer 并使用以下代码将其居中 float textLayerVerticlePadding self bounds size he
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 将 iPad xib 转换为 iPhone xib

    我看过很多关于将 iPhone xib 转换为 iPad xib 的帖子和教程 但我想反过来做 我能找到的唯一资源是 将 iPad 应用程序转换为 iPhone https stackoverflow com questions 68550
  • 在 Objective-C 中的 Swift 类上调用 NSStringFromClass 返回模块损坏的名称

    我知道这个问题 https stackoverflow com questions 24107658 get a user readable version of the class name in swift in objc nsstri
  • Xcode 异步单元测试在主线程上等待

    我正在尝试使用 Xcode 中的单元测试来测试一些异步代码 但主线程被阻塞 问题在于 某些正在测试的代码期望从 iOS 类 AVFoundation 接收回调 但是 AVFoundation 类似乎只会在主线程上回调 问题是 如果我正在进行
  • 使用强光混合模式时突出显示伪影

    我正在 iPhone 应用程序中使用顶部图像的 HardLight 混合模式混合两个图像 它看起来像这样 UIGraphicsBeginImageContext size sourceImage drawInRect rectangle b
  • 上传存档错误:“缺少 iOS 发行版签名身份......”

    我正在尝试使用 Xcode 将我的 iOS 应用程序存档上传到 iTunes Connect 但是当我单击 上传到 App Store 时 出现错误 Xcode 尝试查找或生成匹配的签名资产并 由于以下问题未能做到这一点 缺少 iOS 为

随机推荐

  • 密码盐如何帮助抵御彩虹表攻击?

    我在理解密码盐的用途时遇到一些困难 据我了解 主要用途是阻止彩虹表攻击 然而 我所见过的实现这一点的方法似乎并没有真正使问题变得更加困难 我看过很多教程建议盐的使用方式如下 hash md5 salt password 原因是散列现在映射的
  • ASP.NET 验证器比较两个日期相差不超过 12 个月

    我有两个TextBox控制开始日期和结束日期输入 我必须验证结束日期不大于开始日期 并且开始日期和结束日期之间的差异不超过 12 个月 你将不得不使用一个CustomValidator http msdn microsoft com en
  • 带有 plesk 的 nginx 反向代理

    我已经在这里看到了一些答案 但似乎没有一个解决方案有效 我有安装了 wordpress 的domain com 以及在domain com 6000上运行的脚本 我希望能够让 script domain com 显示 domain com
  • 何时使用 deferred.reject()?

    我很困惑什么时候使用deferred resolve and deferred reject 快速示例 var doSomething function var deferred Deferred if typeof myVar objec
  • 如何使用 Angular 验证表行数据?

    I have table with ng repeat对于表行 我想对单行数据进行内联编辑和验证 但不可能使用form or ng form里面的表 对于内联编辑 我使用输入ng show inside td 所以 我有两个问题 这是内联编
  • 具有大量 UNION 的 SPARQL 查询的替代方案

    我在 Virtuoso 中存储了一些命名图表 我想从提供的列表中找到与最多术语匹配的图表 我的查询是以编程方式构建的 如下所示 SELECT DISTINCT graph count DISTINCT match as matches WH
  • ModuleNotFoundError:没有名为“tensorflow.python.tools”的模块; “tensorflow.python”不是一个包

    Tensorflow 完全可以在 Jupyter Notebook 上工作 但是当我尝试 import tensorflow 在 pycharm 或只是在终端中 我得到 Traceback most recent call last Fil
  • React-Native-Styled-Components:类型“DefaultTheme”上不存在属性“backgroundColor”

    我正在为我的应用程序使用react native Typescript 我的样式组件版本是 styled components 5 3 0 我已经创建了自定义ThemeProvider并包装到我的根应用程序 我的应用程序有切换深色主题 我的
  • 如何使用 IBM Bluemix Track & Plan 管理多个组件

    我们有一个由多个不同组件 不同功能 语言 组成的应用程序 在 IBM Bluemix 中是否可以使用单个 Track Plan 功能来管理组件的工作项 但将源代码保留在单独的 git 存储库中 例如 我希望整个应用程序有一个积压工作 然后由
  • 如何通过 FTP 访问我的 Azure 应用服务文件? wwwroot 目录为空

    使用 Azure 门户中应用服务页面导航上的部署中心链接 我能够找到我的 FTP 凭据并使用它们轻松登录 但是 wwwroot 文件夹中除了hostingstart html 之外没有任何文件 但是 当我使用 Azure 控制台时 我的所有
  • Android NDK 无法使用两个 gradle 插件调试本机代码

    我使用 NDK 和实验性 gradle 插件 最初我能够调试我的本机代码 然后我看到了这个问题https github com googlesamples android ndk issues 119 https github com go
  • 如何在Android文件系统上模拟文件的“tail”命令?

    我的 SD 卡上有文件 我的应用程序使用它作为日志文件 是否可以通过 adb 实时监视文件的所有更改 喜欢与tail f sdcard myfile log命令 这似乎对我很有用 adb shell while true do cat sl
  • 如何使用OKHTTP发出post请求?

    我读了一些将 json 发布到服务器的示例 有人说 OkHttp 是 HttpUrlConnection 接口的实现 由Java提供 它提供了一个用于写入内容的输入流 不知道 或关心 该内容是什么格式 现在我想使用名称和密码参数向 URL
  • 提取 Objective-c 二进制文件

    是否可以提取二进制文件 获取二进制文件背后的代码 使用类转储 您可以看到实现地址 但是是否也可以看到实现地址中的代码 有什么办法可以做到吗 您的所有代码都会编译为单个指令 并放置在可执行文件的文本部分中 编译器负责将高级语言转换为更简单的处
  • 简单的、结构类型的 XML 数据绑定(无需代码生成或反射)

    我正在寻找一个 Java 库 它允许我将 XML 编组到 Java 对象树 反之亦然 有很多库可以让我将 XML 绑定到JavaBeans由某些代码生成工具生成 但是 我不需要这些 JAXB JiBX Castor 等 我需要的是一个工具
  • 如何做 pd.get_dummies 或其他方式?

    实际上 我的问题是基于 是否有更快的方法根据条件更新数据框列值 https stackoverflow com questions 46678400 is there a faster way to update dataframe col
  • WCF 数据服务支持的 Linq

    我正在寻找与 WCF 数据服务兼容的受支持 linq 扩展方法的完整列表 通过反复试验 我发现 First Func 和 Single Func 不受支持 还有其他吗 This http msdn microsoft com en us l
  • Java - 如何检查字符串中的重复字符?

    我需要编写一个函数来检查字符串中是否有重复值并返回唯一字符的计数 如果计数大于 3 则应返回 true 如果计数小于 3 则应该为 false 这是我一直在尝试的 注意我是java新手 private boolean isFormatVal
  • SSE (SIMD):向量乘标量

    我在程序中执行的常见操作是按标量缩放向量 V s 例如 1 2 3 4 2 2 4 6 8 除了首先在向量中的每个位置加载标量 例如 mm set ps 2 2 2 2 然后相乘之外 是否有 SSE 或 AVX 指令可以执行此操作 这就是我
  • 如何从 UIView 创建 CGLayer 进行离屏绘图

    我已经阅读了我认为是 Quartz 2D 编程指南的相关部分 但找不到以下内容的答案 他们似乎在文档中没有过多谈论 iOS 我的应用程序在UIView 我时不时地必须以某种方式更新绘图 例如更改其中一个形状的填充颜色 我保留CGPathRe