如何从 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 进行离屏绘图 的相关文章

  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo
  • 在 iOS 上使用 HEVC 编码器输出视频尺寸巨大

    我有一个项目 目前使用 H 264 编码器在 iOS 上录制视频 我想尝试在 iOS 11 中使用新的 HEVC 编码器来减小文件大小 但发现使用 HEVC 编码器会导致文件大小急剧膨胀 GitHub 上的一个项目显示了该问题 它使用 H
  • skView.ignoreSiblingOrder 在 swift 中的重要性/效率?

    这样做有多重要 高效skView ignoreSiblingOrder true初始化场景时 现在 我将其设置为 true 但由于某种原因 当我从 MainMenu 场景启动 GameScene 时 它 会在我的角色之前加载背景 即使背景的
  • 如何在 NSDate 变量中仅设置时间?

    我有 NSDate 变量 只想更改时间 不应更改日期 是否可以 例如 用户在 DatePicker 日期中选择日期间隔 如果是开始日期 我想将时间设置为 00 00 00 如果是结束日期 我将时间设置为 23 59 59 感谢你的帮助 问候
  • 横向旋转到纵向时的字体大小怪异 - CSS 媒体查询 - iPhone5 Safari

    我已经用谷歌搜索了这个 但无法弄清楚 谢谢你的帮助 Studiolynch com 响应式和流体布局 在 iphone 5 Safari 中完美运行 除了从横向模式旋转到纵向模式会使字体大小小于应有的大小 但是 如果您最初以纵向模式加载页面
  • 有没有办法阻止 iOS 上的 Safari 在关闭时清除网站的 cookie?

    我的移动网络应用程序的一位用户抱怨说 每次他关闭手机屏幕后使用该应用程序时 他都必须重新登录该应用程序 发生的情况是 当屏幕关闭时 或者当您通过双击主页按钮并滑开 Safari 来完全关闭 Safari 时 Safari 会清除该网站的 C
  • 如何从 iOS 应用程序检测不安全的 wifi 网络

    我想检测我的应用程序中是否存在不安全的 wifi 网络 是否有任何公共 iOS API 可以实现相同的目的 没有记录的 API 可以获取该信息 如果您的应用程序需要通过网络发送和接收敏感数据 您通常应该假设没有安全连接
  • iOS:将观察者添加到 UIView 的frame.origin.y?

    我正在尝试监视 UIView 框架原点的变化值并对其做出反应 我的代码 cell bottomView addObserver self forKeyPath frame origin options NSKeyValueObserving
  • iOS 解析如何通过 URL 下载文件

    我正在将 parse 用于我的聊天应用程序 当我上传文件时 我保留该 url 并将该 url 发送给其他用户 然后其他用户可以通过该 URL 下载文件 这是我上传文件的代码 void uploadBlob NSData blob fileN
  • 奇怪的行为与缓存。清单/离线使用网络应用程序保存到ipad ios6的主屏幕

    我刚刚在装有新 iOS 6 的 iPad 上发现了一些奇怪的行为 我正在测试一个用于离线使用的网络应用程序 Web 应用程序只不过是一个带有缓存清单的静态网站 因此没有使用像 sencha touch 这样的特殊框架或像 phnoegap
  • ios Vision VNImageRequestHandler方向问题

    我正在尝试使用相机通过相机检测脸部VNImageRequestHandler iOS 愿景 当我在横向模式下用相机指向照片时 它会检测到面部 但方向模式相反 let detectFaceRequestHandler VNImageReque
  • UICollectionReusableView 方法未被调用

    我希望我的部分位于UICollectionView有一个带有图像的标题 我已按照以下步骤操作 在故事板中 分配了一个标题作为我的附件UICollectionView 给它一个标识符 创建了一个子类UICollectionReusableVi
  • iOS NSURLSession,如何在didCompleteWithError中重试

    我想在我的服务器上尝试一次调用 直到成功为止 我想每 30 秒尝试一次 所以我使用 NSURLSession 进行通话 NSURLSessionDownloadTask task self session downloadTaskWithR
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb
  • 如何以编程方式使用资产目录图像的切片信息?

    我的项目中曾经有一个图像 我会像这样加载它 UIImage image UIImage imageNamed image name resizableImageWithCapInsets UIEdgeInsetsMake 10 0f 10
  • 断点条件错误

    我已经根据条件设置了断点 event name isEqualToString Some Name 这很好用 但是 当我尝试添加另一个带有条件的断点时 part name isEqualToString Some Value With A
  • 将应用程序登录凭据发送给 AppStore 审核者

    我刚刚将我的应用程序上传到应用程序商店 该应用程序需要用户名 密码才能登录 但在上传过程中从未提示我输入任何凭据 有谁知道我如何向审阅者发送我的凭据 而不必等待他们审阅并请求凭据 您编辑应用程序元数据 标题 描述 关键字等 的页面最底部字段
  • 快速钥匙串更新只有在第二次尝试时才起作用

    您好 我在更新存储在钥匙串中的登录信息方面遇到了 iOS 钥匙串的一个非常奇怪的问题 因此 如果没有保存的凭据 则正确运行保存函数会保存登录信息 如果登录信息已存在并且用户更新了密码 则更新功能仅正确更新密码 但是 如果登录信息存在并且我尝
  • 使用 nib 作为带有 nib 类的表节标题

    我想创建一个加载 nib 文件并将其设置为标题 UIView 的节标题 这个 nib 文件还将有一个关联的类 其中插座和操作连接到 因此我想像平常一样使用 nib 加载该类 我在网上搜索并找到了几个类似的答案 但我找不到任何适合我的答案 经
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓

随机推荐

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

    我在理解密码盐的用途时遇到一些困难 据我了解 主要用途是阻止彩虹表攻击 然而 我所见过的实现这一点的方法似乎并没有真正使问题变得更加困难 我看过很多教程建议盐的使用方式如下 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