我想从 UIView 创建 PDF。现在我想复制图层并将其调整为 DIN A4 页面大小。
CGRect A4PageRect = CGRectMake(0, 0, 595, 842);
CALayer *myLayer = [pdfView layer];
myLayer.bounds = pageRect;
但是这个 cody 调整了我屏幕上可见层的大小。
如何复制图层内容以调整其大小以适合 A4 页面?
谢谢你的帮助,朱利安
FWIW,您可以制作一个CALayer
通过的浅表副本:
(斯威夫特 3)
let tmp = NSKeyedArchiver.archivedData(withRootObject: myLayer)
let copiedCA = NSKeyedUnarchiver.unarchiveObject(with: tmp) as! CALayer
(或您正在使用的任何子类。例如CAShapeLayer
)
无法复制 CALayer。
(CoreAnimation 很难以合理的方式实现它。可能有一整棵子层树,并且它们都可能有影响其行为的委托,它们不会期望突然从层的副本中获取请求.)
我只能猜测一个更好的解决方案,因为我不了解您的确切情况。您是否有要调整大小的 PDF,或者您只是想获取任意现有图层并从中制作 PDF 文档?
如果是后者:
UIGraphicsBeginPDFContextToData
或UIGraphicsBeginPDFContextToFile
创建 PDF 绘图上下文UIGraphicsBeginPDFPage
或UIGraphicsBeginPDFPageWithInfo
创建页面UIGraphicsGetCurrentContext
以获取 PDF 绘图上下文CGContextScaleCTM
以便您的图层适合 PDF 页面-[CALayer renderInContext:]
以将图层绘制到 PDF 上下文中UIGraphicsEndPDFContext
完成 PDF请注意,这可能看起来很糟糕。图层是基于位图的,因此您将在 PDF 中获得位图。此外,-[CALayer renderInContext:]
它的渲染与屏幕上的渲染并不完全相同——请参阅文档中的注释。
如果这是一个问题,您需要添加一个绕过 CALayer 的单独绘图路径。在第 5 步中,您将使用 CoreGraphics 进行自己的绘图。
在您的情况下,使用建议的解决方案确实更好,但为了记录,是的,您可以以某种方式复制 CALayer:使用 CAReplicatorLayer。
这是一个非常强大的 API,不需要为复制一层而构建,但它也适用。通过复制一系列图层,它可以更好地制作惊人的视觉效果。
有关更多信息,您可以查看苹果官方文档,这里是摘录:
创建其子层(源层)的指定数量副本的层,每个副本都可能应用几何、时间和颜色转换。
这里是John Sundell 的一个很棒的教程,另一个摘录:
CAReplicatorLayer 擅长以高效的硬件加速方式绘制原始层的多个副本(因此它是“复制器”)。在绘制平铺背景、图案或其他应重复多次的东西时,它非常有用。我什至用它来实现我即将推出的开源 Swift 游戏引擎的纹理平铺功能。
最后,这是一个很好的例子,说明了这个 api 可以做什么。