不在 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 的渲染层的主要内容,如果未能解决你的问题,请参考以下文章
[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!