我想从UIView创建PDF。 现在我想复制图层并将其调整为DIN A4页面尺寸。
CGRect A4PageRect = CGRectMake(0, 0, 595, 842);
CALayer *myLayer = [pdfView layer];
myLayer.bounds = pageRect;
但是这个cody调整了屏幕上可见图层的大小。
如何复制图层内容以调整其大小以适合A4页面?
感谢您的帮助,Julian
答案 0 :(得分:2)
无法复制CALayer。
(CoreAnimation很难以合理的方式实现它。可能会有一整层子层,并且它们都可能有代表影响他们的行为,这些代表不会突然得到来自层的副本。)
我只能猜出更好的解决方案,因为我不了解你的具体情况。您是否有想要调整大小的PDF,或者您只是想要获取任意现有图层并从中制作PDF文档?
如果是后者:
UIGraphicsBeginPDFContextToData
或UIGraphicsBeginPDFContextToFile
创建PDF绘图上下文UIGraphicsBeginPDFPage
或UIGraphicsBeginPDFPageWithInfo
以创建网页UIGraphicsGetCurrentContext
以获取PDF绘图背景CGContextScaleCTM
进行缩放,以便您的图层适合PDF页面-[CALayer renderInContext:]
将图层绘制到PDF上下文UIGraphicsEndPDFContext
完成PDF 请注意,这可能看起来很糟糕。图层是基于位图的,因此您将在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
)
答案 2 :(得分:0)
在您的情况下,确实更好地使用建议的解决方案但是为了记录,是的,您可以复制 - 在某种程度上 - CALayer:使用CAReplicatorLayer。
这是一个非常强大的API,不是复制一个层的必要构建,但它也适用于此。通过复制一系列图层,它可以更好地制作出惊人的视觉效果。
有关详细信息,请查看the apple official documentation,此处为摘录:
为其子图层(源图层)创建指定数量的副本的图层,每个副本可能应用了几何,时间和颜色转换。
这里有一个很棒的tutorial by John Sundell,另一个摘录:
CAReplicatorLayer专注于以有效的硬件加速方式绘制原始图层的多个副本(因此它是“复制者”)。在绘制平铺背景,图案或其他应重复多次的事物时,它非常有用。我甚至用它来实现我即将推出的开源Swift游戏引擎的纹理平铺功能。
最后在这里a great example可以用这个api做什么。