重复CALayer

时间:2012-04-07 22:03:58

标签: ios pdf uiview calayer

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

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

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

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

感谢您的帮助,Julian

3 个答案:

答案 0 :(得分:2)

无法复制CALayer。

(CoreAnimation很难以合理的方式实现它。可能会有一整层子层,并且它们都可能有代表影响他们的行为,这些代表不会突然得到来自层的副本。)

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

如果是后者:

  1. 使用UIGraphicsBeginPDFContextToDataUIGraphicsBeginPDFContextToFile创建PDF绘图上下文
  2. 致电UIGraphicsBeginPDFPageUIGraphicsBeginPDFPageWithInfo以创建网页
  3. 致电UIGraphicsGetCurrentContext以获取PDF绘图背景
  4. 使用CGContextScaleCTM进行缩放,以便您的图层适合PDF页面
  5. 调用-[CALayer renderInContext:]将图层绘制到PDF上下文
  6. 致电UIGraphicsEndPDFContext完成PDF
  7. 请注意,这可能看起来很糟糕。图层是基于位图的,因此您将在PDF中获得位图。另外,-[CALayer renderInContext:]的呈现方式与屏幕上的完全相同 - 请参阅文档中的注释。

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

答案 1 :(得分:0)

FWIW,您可以通过以下方式制作CALayer的浅表副本:

(斯威夫特3)

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

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

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

答案 2 :(得分:0)

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

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

有关详细信息,请查看the apple official documentation,此处为摘录:

  

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

这里有一个很棒的tutorial by John Sundell,另一个摘录:

  

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

最后在这里a great example可以用这个api做什么。