gpt4 book ai didi

ios - 更改图层 Z 位置时 renderInContext 无法正常工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:27 24 4
gpt4 key购买 nike

我的应用程序允许用户前后切换 UIImageView,然后用户可以捕获该屏幕。这是我将屏幕捕获到 UIImage

中的代码
-(UIImage *)imageWithView:(UIView *)view
{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 2.0f);

// I even tried view.layer.presentationLayer but still not working
[view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();


return image;

}

我不使用 [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES] 因为它速度较慢并且有时(当 View 不可见时)以黑色绘制屏幕截图。

但是 renderInContext 的问题是在 UIImageView ( imageView.layer.zPosition = 0.01;etc ) 之间变化的 Z 位置。在我的 iPhone 屏幕上,当我将值分配给 zPosition 时,它可以正常工作,但在捕获屏幕上却出错了。

无论如何我可以解决这个问题吗?提前致谢

编辑:这是我在捕获屏幕截图之前尝试做的事情。我使用此代码使一个 ImageView 显示在另一个 ImageView 的前面。

-(void)bringOneLevelUp:(UIImageView*)imageView
{
//_imgArray is sorted by Z position order (small to big)
NSUInteger currentObjectIndex = [_imgArray indexOfObject:imageView];


if(currentObjectIndex+1< _imgArray.count){

UIImageView *upperImageView = [_imgArray objectAtIndex:currentObjectIndex+1];


CGFloat currentZIndex = imageView.layer.zPosition;
CGFloat upperZIndex= upperImageView.layer.zPosition;

imageView.layer.zPosition = upperZIndex;
upperImageView.layer.zPosition = currentZIndex;


// swap position in array
[_imgArray exchangeObjectAtIndex:currentObjectIndex withObjectAtIndex:currentObjectIndex+1];

}

就像我之前解释的一样,手机屏幕上这段代码的结果是正确的。 newImageView 在 lastImageView 的前面。但是当我通过 renderInContext 捕获屏幕截图时。他们不是。

最佳答案

swift 4.2

@RameshVel 的回答对我有用,将其翻译成 Swift,也许有人需要这个:

 UIGraphicsBeginImageContext(drawingCanvas.frame.size)
self.renderInContext(ct: UIGraphicsGetCurrentContext()!)

guard let image = UIGraphicsGetImageFromCurrentImageContext() else {return}
UIGraphicsEndImageContext()

在 renderInContext 函数中:

 func renderInContext(ct:CGContext){

ct.beginTransparencyLayer(auxiliaryInfo: nil)

// descendant ordered list of views based on its z-position
let orderedLayers = self.view.subviews.sorted(by: {
$0.layer.zPosition < $1.layer.zPosition
})

for l in orderedLayers {
l.layer.render(in: ct)
}
ct.endTransparencyLayer()
}

如果你正在绘制和添加层,同样可以用 CALayers 完成:

 UIGraphicsBeginImageContext(drawingCanvas.frame.size)
//Canvas is a custom UIView for drawing
self.renderInContext(ct: UIGraphicsGetCurrentContext()!, canvas: canvas)

guard let image = UIGraphicsGetImageFromCurrentImageContext() else {return}
UIGraphicsEndImageContext()

renderInContext 函数:

func renderInContext(ct:CGContext, canvas:CustomCanvas){

ct.beginTransparencyLayer(auxiliaryInfo: nil)
let layers:[CALayer] = canvas.layer.sublayers!

let orderedLayers = layers.sorted(by: {
$0.zPosition < $1.zPosition
})

for v in orderedLayers {
v.render(in: ct)
}
ct.endTransparencyLayer()
}

关于ios - 更改图层 Z 位置时 renderInContext 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33952066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com