【问题标题】:UIGraphicsGetImageFromCurrentImageContext with CALayers [duplicate]UIGraphicsGetImageFromCurrentImageContext 与 CALayers [重复]
【发布时间】:2012-06-15 06:35:33
【问题描述】:

我正在尝试使用CALayer 子层创建UIView 的图像。使用此代码

- (UIImage*)snapshot{
    UIGraphicsBeginImageContext(self.bounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return viewImage;
}

我得到了一张图片,但它不能准确地代表屏幕上显示的内容。特别是,它不尊重CAShapeLayer 掩码属性。我的圆角没有出现在图像中。

下面是一个示例在屏幕上的显示方式与它在图像中的显示方式的比较:

为了澄清一下,右边的图像与旧对象放置在相同的位置,基本上是对对象进行了光栅化。这就是为什么有相同的背景;它不是我正在捕捉图像的对象的一部分。

如何在图像中保留CAShapeLayer 蒙版的同时捕获对象的图像?

编辑:似乎问题在于图层蒙版,而不是路径。

【问题讨论】:

    标签: objective-c cashapelayer quartz-core


    【解决方案1】:

    直接来自 CALayer 类参考:

    此外,不渲染...指定 backgroundFilters、过滤器、compositingFilter 或 ma​​sk 值的图层。

    我使用的是蒙版,​​而不是 CGPath。 (嗯,带有路径的 CALayer 是我的面具,但仍然如此。)

    然而,另一个问题是我无法切换到使用路径而不是蒙版,因为我使用的是渐变,而 CAGradientLayer 没有像 CAShapeLayer 这样的路径属性,这就是我使用蒙版的原因。

    【讨论】:

      【解决方案2】:

      不要使用self.bounds.sizeself.layer,而是使用圆角的视图。 假设如果是imageView 那么

      - (UIImage*)snapshot
      {
          UIGraphicsBeginImageContext(imageview.size);
          [imageview.layer renderInContext:UIGraphicsGetCurrentContext()];
          UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
          UIGraphicsEndImageContext();
          return viewImage;
      }
      

      【讨论】:

      • 视图包含许多子类 UIButtons 作为子视图。这些 UIButton 子类对象包含多个 CAShapelayers 作为子层。正是这些 CAShapeLayers 包含圆角。如果不将每个 CALayer 捕获为单独的图像,我怎么能做到这一点?
      • 这确实不能回答问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2023-04-03
      • 2015-04-07
      • 1970-01-01
      • 2011-11-03
      相关资源
      最近更新 更多