为啥添加的子图层不显示在屏幕截图中?

Posted

技术标签:

【中文标题】为啥添加的子图层不显示在屏幕截图中?【英文标题】:Why don't added sublayers show up in screenshot?为什么添加的子图层不显示在屏幕截图中? 【发布时间】:2012-10-24 13:15:04 【问题描述】:

我正在尝试查找 iPad 应用程序的某些 ios 代码中的错误。在我们的一个视图中,我们添加了具有阴影的子层,并确保视图的底部具有圆形边缘。这是我们添加子层的代码:

    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
                                                   byRoundingCorners:(UIRectCornerBottomLeft|UIRectCornerBottomRight)
                                                         cornerRadii:CGSizeMake(12.0f, 12.0f)];

    // Create the shadow layer
    shadowLayer = [CAShapeLayer layer];
    [shadowLayer setFrame:self.bounds];
    [shadowLayer setMasksToBounds:NO];
    [shadowLayer setShadowPath:maskPath.CGPath];
    shadowLayer.shadowColor = [UIColor blackColor].CGColor;
    shadowLayer.shadowOffset = CGSizeMake(0.0f, 0.0f);
    shadowLayer.shadowOpacity = 0.5f;
    shadowLayer.shadowRadius = 6.0f;

    roundedLayer = [CALayer layer];
    [roundedLayer setFrame:self.bounds];
    [roundedLayer setBackgroundColor:[UIColor colorFromHex:@"#e4ecef"].CGColor];

    [self.layer insertSublayer:shadowLayer atIndex:0];

    // Add inner view (since we're rounding corners, parent view can't mask to bounds b/c of shadow - need extra view)
    maskLayer = [CAShapeLayer layer];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;
    innerView = [[UIView alloc] initWithFrame:self.bounds];
    innerView.backgroundColor = [UIColor whiteColor];
    innerView.layer.mask = maskLayer;
    [self addSubview:innerView];

它在 iPad 的屏幕上显示良好,但我想以编程方式截取屏幕截图。我用这个方法给 UIView 添加了一个类别:

- (UIImage*)screenshot 
    UIGraphicsBeginImageContext(self.frame.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
    return viewImage;

当我查看截取的屏幕截图时,它不再有圆角或我视野后面的阴影。他们为什么不出现?

【问题讨论】:

【参考方案1】:

在这里找到解释:CALayer renderInContext

此外,使用 3D 变换的图层不会被渲染,也不会 指定 backgroundFilters、filters、compositingFilter 或 掩码值。

看起来有些子层无法由 renderInContext 处理,这就是它们没有出现在我的屏幕截图中的原因。

【讨论】:

所以没有办法用子图层截屏?【参考方案2】:

渐变子层

快照没有拍摄任何带有alpha 频道的gradient layers。 从颜色中删除 alpha,对我有用

【讨论】:

以上是关于为啥添加的子图层不显示在屏幕截图中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 layoutsubviews/viewdidlayoutsubviews 中捕获的视图的屏幕截图不是最终在屏幕上呈现的?

屏幕截图显示为空白 - Swift

为啥我无法截取 MPMoviePlayerController 的屏幕截图?

电脑为啥截屏时屏幕会变大但显示出来的只有左上角一小块,却放大到整个屏幕?

SceneKit - 为啥添加聚光灯会使地板变黑?

为啥在firebase onAuthStateChanged中完成活动时最近的应用程序中没有屏幕截图