不在 View Hierarchy 中的 UIView 的渲染层

Posted

技术标签:

【中文标题】不在 View Hierarchy 中的 UIView 的渲染层【英文标题】:Render layer of UIView which is not in the View Hierarchy 【发布时间】:2013-04-03 10:45:32 【问题描述】:

我想要实现的是拍摄尚未添加为子视图的UIView 的图像,呈现并处理图像,然后将视图添加到视图层次结构中。

我已经搜索并尝试了一段时间,并相信这根本不可能。


很明显,问题是,如果视图没有被添加为子视图,那么它还没有被绘制(我猜叫drawRect:)。 其实我以为renderInContext: 会自己打电话给drawRect/layer

在将其绘制到 imageContext 之前将其添加为子视图甚至是不够的,因为它不会立即呈现。

我用renderInContext:和视图层截图,在这里查看我的代码:

[self.view addSubView:view];
UIGraphicsBeginImageContextWithOptions(view.frame.size, YES, 0);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextTranslateCTM(context, -frame.origin.x, -frame.origin.y);

[view.layer renderInContext:context];

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

所以我的问题是,有没有人设法渲染 不可见 UIView 以及如何渲染?

【问题讨论】:

【参考方案1】:

这很尴尬。 在与一位非常友好的苹果开发支持人员进行邮件交谈后,我们查看了我的代码,我们注意到我只是将hidden 属性设置为YES。 - 不要那样做。

因此,直接对不在视图层次结构中的视图进行屏幕截图。 为什么它不起作用完全是我的错。

【讨论】:

【参考方案2】:

尝试将 UIView 添加到层次结构但保持隐藏。

- (void)takeScreenSnapshot 

     UIView *capturedView = self.view;    
     UIView *hiddenView = self.hiddeniew;  //  hidden view which is 
                                           //  a part of capturedView   
     hiddenView.hidden = NO;

     BOOL retina = [self isRetinaDisplay];
     UIImage *image = [capturedView captureImageWithScale:(retina) ? 2.f : 1.f];

     hiddenView.hidden = YES;

【讨论】:

很遗憾不是我想要的。即使它可以工作,我也无法添加之前的视图。

以上是关于不在 View Hierarchy 中的 UIView 的渲染层的主要内容,如果未能解决你的问题,请参考以下文章

view hierarchy iOS

[MAC OS] XCode中的Debug View Hierarchy功能

DDMS android 开发工具-----dump View Hierarchy for UI automator

NavigationController 和 View Hierarchy 问题

whose view is not in the window hierarchy

Warning: Attempt to present on whose view is not in the window hierarchy!