Swift 中使用 renderInContext 在屏幕上出现时捕获所选视图的问题
Issue capturing selected views as they appear on screen with renderInContext in Swift
我的故事板有三个视图,viewA
、viewB
、viewC
。
我正在尝试截屏只有两个视图出现在屏幕上的当前位置,viewB
和 viewC
.
问题是,当我渲染它们时,捕获的结果图像在不正确的位置显示 viewB
和 viewC
,视图的位置改变移动到左上角 (0, 0),请参见图片。
我如何更正下面的代码,以便我可以使用下面的 renderInContext
实现准确地捕获视图 viewB
和 viewC
在视图中的位置?
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0)
self.viewB.layer.renderInContext(UIGraphicsGetCurrentContext()!)
self.viewC.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
来自 renderInContext:
的文档:
Renders in the coordinate space of the layer.
每个视图的图层原点为 0,0,因此它们都出现在左上角。
要解决此问题,您需要在调用 renderInContext:
.
之前通过视图的原点转换图形上下文
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0)
let ctx = UIGraphicsGetCurrentContext()
CGContextSaveGState(ctx)
CGContextTranslateCTM(ctx, self.viewB.frame.origin.x, self.viewB.frame.origin.y)
self.viewB.layer.renderInContext(UIGraphicsGetCurrentContext()!)
CGContextRestoreGState(ctx)
CGContextSaveGState(ctx)
CGContextTranslateCTM(ctx, self.viewC.frame.origin.x, self.viewC.frame.origin.y)
self.viewC.layer.renderInContext(UIGraphicsGetCurrentContext()!)
CGContextRestoreGState(ctx)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
我的故事板有三个视图,viewA
、viewB
、viewC
。
我正在尝试截屏只有两个视图出现在屏幕上的当前位置,viewB
和 viewC
.
问题是,当我渲染它们时,捕获的结果图像在不正确的位置显示 viewB
和 viewC
,视图的位置改变移动到左上角 (0, 0),请参见图片。
我如何更正下面的代码,以便我可以使用下面的 renderInContext
实现准确地捕获视图 viewB
和 viewC
在视图中的位置?
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0)
self.viewB.layer.renderInContext(UIGraphicsGetCurrentContext()!)
self.viewC.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
来自 renderInContext:
的文档:
Renders in the coordinate space of the layer.
每个视图的图层原点为 0,0,因此它们都出现在左上角。
要解决此问题,您需要在调用 renderInContext:
.
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0)
let ctx = UIGraphicsGetCurrentContext()
CGContextSaveGState(ctx)
CGContextTranslateCTM(ctx, self.viewB.frame.origin.x, self.viewB.frame.origin.y)
self.viewB.layer.renderInContext(UIGraphicsGetCurrentContext()!)
CGContextRestoreGState(ctx)
CGContextSaveGState(ctx)
CGContextTranslateCTM(ctx, self.viewC.frame.origin.x, self.viewC.frame.origin.y)
self.viewC.layer.renderInContext(UIGraphicsGetCurrentContext()!)
CGContextRestoreGState(ctx)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()