如何设置由UIBezierPath整形的CAShapeLayer的内容

时间:2016-11-24 06:27:21

标签: ios objective-c calayer

我试图在UIImageView上添加一个遮罩层。该图像视图通过设置其内容来保持图像并且掩模层保持另一图像。但是当我将遮罩层添加到imageview图层上时,遮罩层不会保留任何图像。掩模层已由getter初始化。添加掩码层的方法如下:

- (void)circleButtonClicked{
    self.maskLayer.contents = (id)[UIImage imageNamed:@"mask.jpg"].CGImage;
    self.maskLayer.frame = CGRectMake(0, 0, kSCREEN_WIDTH, kSCREEN_WIDTH);
    self.maskLayer.opacity = 0.5;

    [self.imageView.layer addSublayer:self.maskLayer];

    UIBezierPath * pPath = [UIBezierPath bezierPathWithArcCenter:self.imageView.center radius:(kSCREEN_WIDTH-100)/2 startAngle:0.0 endAngle:M_PI*2 clockwise:YES];
    self.maskLayer.path = pPath.CGPath;
    UIBezierPath * otherPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, kSCREEN_WIDTH, kSCREEN_WIDTH)];
    self.maskLayer.path = otherPath.CGPath;
    [otherPath appendPath:pPath];
    self.maskLayer.path = otherPath.CGPath;
    self.maskLayer.fillRule = kCAFillRuleEvenOdd;
} 

1 个答案:

答案 0 :(得分:1)

形状图层用于显示路径而不是图像。提供图层内容有三种不同的方法(参见Core Animation Programming Guide),但一次只能提供一种。

您的代码中有些内容我不明白:

  1. 您的maskLayer只是一个普通图层,而不是面具。如果要将其用作遮罩,则应使用mask的{​​{1}}属性,而不是将其添加为子图层。
  2. 您的图层应包含图像和路径,并且应该是图像视图中的子图层。我认为更容易使用图片视图并将其作为子视图添加到CALayer
  3. 如果要将图像用作遮罩(应该可以),则不应使用JPEG图像作为源。仅考虑遮罩层的alpha值,但整个JPEG图像的alpha值为1。因此,使用JPEG图像相当于使用实心方块或不应用蒙版。