【问题标题】:UIImage as CAShapeLayer contentsUIImage 作为 CAShapeLayer 内容
【发布时间】:2012-07-24 13:43:30
【问题描述】:

如果我创建一个只有背景颜色的 CAShapeLayer,它会显示出来,但如果我将内容设置为图像,则什么也不会显示。

CAShapeLayer* leftDot = [CAShapeLayer layer];
leftDot.opacity = 1.0;
leftDot.frame = CGRectMake(leftRef.CGPointValue.x, leftRef.CGPointValue.y, 2 * radius, 2 * radius);
leftDot.position = CGPointMake(leftRef.CGPointValue.x + 4, leftRef.CGPointValue.y + 4);
leftDot.cornerRadius = radius;
[leftDot setContents:[UIImage imageNamed: @"glow.png"]];

[self.layer addSublayer: leftDot];

【问题讨论】:

    标签: objective-c ios core-animation


    【解决方案1】:

    [注意:更新到 Swift 2.2 和 Swift 3]

    快速回答:使用 CALayer

    CAShapeLayer Class Reference 中所述,CAShapeLayer 用于使用自定义路径绘制形状。将图像设置为其contents 将被忽略。

    如果您只想在图层中显示图像(假设您的文件名为image.png),您可以使用CALayer 并设置其contents 属性,以便它引用CGImage 表示你的图片:

    斯威夫特 2.2:

    let layer = CALayer()
    layer.contents = UIImage(named: "image")?.CGImage
    

    斯威夫特 3:

    let layer = CALayer()
    layer.contents = UIImage(named: "image")?.cgImage
    

    更长的答案:继续使用 CAShapeLayer

    由于 OP 专门询问了 CAShapeLayer,因此问题可能类似于“如何使用 CAShapeLayer 将图像裁剪为特定形状?”

    我建议您尝试两种解决方案:

    1) 掩蔽

    创建一个普通的CALayer 并将图像设置为其contents。然后用你喜欢的路径创建一个CAShapeLayer,作为第一层的mask

    斯威夫特 2.2:

    let imageLayer = CALayer()
    imageLayer.contents = UIImage(named: "image")?.CGImage // Assign your image
    imageLayer.frame = ... // Define a frame
    
    let maskPath = UIBezierPath(...) // Create your path
    let maskLayer = CAShapeLayer()
    maskLayer.path = maskPath.CGPath
    
    imageLayer.mask = maskLayer // Set the mask
    

    斯威夫特 3:

    let imageLayer = CALayer()
    imageLayer.contents = UIImage(named: "image")?.cgImage // Assign your image
    imageLayer.frame = ... // Define a frame
    
    let maskPath = UIBezierPath(...) // Create your path
    let maskLayer = CAShapeLayer()
    maskLayer.path = maskPath.cgPath
    
    imageLayer.mask = maskLayer // Set the mask
    

    不要忘记设置正确的框架和路径,应该可以达到你想要的效果。

    2) 填充颜色

    使用您喜欢的路径创建一个CAShapeLayer,然后使用您的图像作为它的fillColor

    斯威夫特 2.2:

    let path = UIBezierPath(...) // Create your path
    let layer = CAShapeLayer()
    layer.path = path.CGPath
    
    let image = UIImage(named: "image") // Assign your image
    layer.fillColor = UIColor(patternImage: image!).CGColor
    

    斯威夫特 3:

    let path = UIBezierPath(...) // Create your path
    let layer = CAShapeLayer()
    layer.path = path.cgPath
    
    let image = UIImage(named: "image") // Assign your image
    layer.fillColor = UIColor(patternImage: image!).cgColor
    

    一开始您可能会发现这种方法更容易,但控制图像填充形状的方式并非易事。

    【讨论】:

    • 感谢您添加原因。我试图将图像设置为 CAShapeLAyer 的内容。现在我意识到了,我的错误。
    【解决方案2】:

    CAShapeLayer 不是这样工作的。您将创建一个普通的 CALayer,以图像作为其内容,然后使用形状图层作为该图层的蒙版,以达到您想要的效果。

    【讨论】:

      【解决方案3】:

      您可以通过设置fillColor 而不是contents 来显示图像:

      layer.fillColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"image"]].CGColor;
      

      【讨论】:

      • 您能否进一步详细说明您的回答如何解决了这个问题?
      • 你可以使用上面的代码解决这个问题,如下所示: CAShapeLayer* leftDot = [CAShapeLayer layer]; leftDot.opacity = 1.0; leftDot.frame = CGRectMake(leftRef.CGPointValue.x, leftRef.CGPointValue.y, 2 * 半径, 2 * 半径); leftDot.position = CGPointMake(leftRef.CGPointValue.x + 4, leftRef.CGPointValue.y + 4); leftDot.cornerRadius = 半径; leftDot.fillColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"image"]].CGColor; [self.layer addSublayer: leftDot];
      【解决方案4】:
      layerName.contents = (id)[[UIImage imageNamed:@"img.PNG"] CGImage];
      

      【讨论】:

      • 这样做会得到什么结果? CAShapeLayers 对我来说从来没有用过。而是塑造图层描边并填充它们的路径。
      【解决方案5】:

      你必须为图层设置CGImage

      leftDot.fillColor=[UIColor clearColor].CGColor ;
      [leftDot setContents:(__bridge id)[UIImage imageNamed: @"glow.png"].CGImage];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 2023-04-08
        • 2018-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        相关资源
        最近更新 更多