1

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

CGRect A4PageRect = CGRectMake(0, 0, 595, 842);
CALayer *myLayer = [pdfView layer];
myLayer.bounds = pageRect;

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

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

谢谢你的帮助,朱利安

4

3 回答 3

3

FWIW,您可以制作一个CALayer通过的浅表副本:

(斯威夫特 3)

let tmp = NSKeyedArchiver.archivedData(withRootObject: myLayer)
let copiedCA = NSKeyedUnarchiver.unarchiveObject(with: tmp) as! CALayer

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

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

于 2017-03-06T02:27:09.597 回答
2

无法复制 CALayer。

(CoreAnimation 很难以合理的方式实现它。可能有一整棵子层树,并且它们都可能有影响其行为的委托,它们不会期望突然从层的副本中获取请求.)

我只能猜测一个更好的解决方案,因为我不了解您的确切情况。您是否有要调整大小的 PDF,或者您只是想获取任意现有图层并从中制作 PDF 文档?

如果是后者:

  1. 使用UIGraphicsBeginPDFContextToDataUIGraphicsBeginPDFContextToFile创建 PDF 绘图上下文
  2. 调用UIGraphicsBeginPDFPageUIGraphicsBeginPDFPageWithInfo创建页面
  3. 调用UIGraphicsGetCurrentContext以获取 PDF 绘图上下文
  4. 使用缩放,CGContextScaleCTM以便您的图层适合 PDF 页面
  5. 调用-[CALayer renderInContext:]以将图层绘制到 PDF 上下文中
  6. 致电UIGraphicsEndPDFContext完成 PDF

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

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

于 2012-04-08T01:28:54.133 回答
0

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

这是一个非常强大的 API,不需要为复制一层而构建,但它也适用。通过复制一系列图层,它可以更好地制作惊人的视觉效果。

有关更多信息,您可以查看苹果官方文档,这里是摘录:

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

这里是John Sundell 的一个很棒的教程,另一个摘录:

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

最后,这是一个很好的例子,说明了这个 api 可以做什么。

于 2018-04-26T19:47:50.580 回答