首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重复的CALayer

重复的CALayer
EN

Stack Overflow用户
提问于 2012-04-08 06:03:58
回答 3查看 5K关注 0票数 1

我想从UIView创建一个PDF。现在,我想复制图层并将其调整为DIN A4页面大小。

代码语言:javascript
运行
复制
CGRect A4PageRect = CGRectMake(0, 0, 595, 842);
CALayer *myLayer = [pdfView layer];
myLayer.bounds = pageRect;

但是这个cody调整了我屏幕上的可视层的大小。

如何复制图层内容以调整其大小以适应A4页面?

谢谢你的帮助,朱利安

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-08 09:28:54

无法复制CALayer。

(对于CoreAnimation来说,很难以一种合理的方式实现这一点。可能有一整棵子层树,它们可能都有影响其行为的代理,这不会期望突然从层的副本中获得请求。)

我只能猜测一个更好的解决方案,因为我不了解你的确切情况。您是否有一个PDF,您正在尝试调整大小,或您只是想采取一个任意的现有图层,并从它的PDF文档?

如果是后者:

  1. 使用UIGraphicsBeginPDFContextToDataUIGraphicsBeginPDFContextToFile创建PDF绘图上下文
  2. 调用UIGraphicsBeginPDFPageUIGraphicsBeginPDFPageWithInfo创建页面<代码>H19调用<代码>C10使用<代码>C13获取

绘图context

  1. Scale,这样您的图层将适合PDF页面<代码>H214<代码>C16调用<代码>C16<代码>H217<代码>H118调用<代码>D19以完成<代码>H220<代码>G221

请注意,这可能看起来很糟糕。图层是基于位图的,因此您将在PDF中获得位图。此外,-[CALayer renderInContext:]不会呈现与屏幕上完全相同的效果--请参阅文档中的注释。

如果这是一个问题,您将需要添加绕过CALayer的单独绘图路径。在第5步中,您将使用CoreGraphics绘制自己的图形。

票数 2
EN

Stack Overflow用户

发布于 2017-03-06 10:27:10

FWIW,您可以通过以下方式创建CALayer的浅层副本:

(Swift 3)

代码语言:javascript
运行
复制
let tmp = NSKeyedArchiver.archivedData(withRootObject: myLayer)
let copiedCA = NSKeyedUnarchiver.unarchiveObject(with: tmp) as! CALayer

(或您正在使用的任何子类。例如CAShapeLayer)

感谢:https://stackoverflow.com/a/35345819/1452758

票数 3
EN

Stack Overflow用户

发布于 2018-04-27 03:47:51

在您的情况下,使用建议的解决方案确实更好,但为了记录,是的,您可以复制-在某种程度上- CALayer :使用CAReplicatorLayer。

这是一个非常强大的API,不需要为复制一个层而构建,但它也适用于此。通过复制一系列图层,它甚至更适合制作令人惊叹的视觉效果。

有关更多信息,您可以查看the apple official documentation,以下是摘录:

为其子层(源层)创建指定数量副本的图层,每个副本可能会对其应用几何、时间和颜色变换。

下面是一个很棒的tutorial by John Sundell,另一个摘录:

CAReplicatorLayer专门绘制原始层的多个副本(因此它是一个“复制器”),以一种高效的硬件加速方式。当绘制像平铺背景,图案或其他应该重复多次的东西时,它非常有用。我甚至用它来实现我即将推出的开源Swift游戏引擎的纹理平铺功能。

最后,在这里a great example我们可以用这个接口做些什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10058752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档