CAShapeLayer 蒙版不显示

CAShapeLayer mask doesn't show up

我正在使用 UIBezierPathCAShapeLayer 制作面具,代码如下:

- (void)createPath {
    UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(0, 0)];
    [path addLineToPoint:CGPointMake(100, 100)];
    [path moveToPoint:CGPointMake(100, 100)];
    [path addLineToPoint:CGPointMake(0, 100)];
    [path moveToPoint:CGPointMake(0, 100)];
    [path addLineToPoint:CGPointMake(0, 0)];
    [path closePath];

    CAShapeLayer *layer = [CAShapeLayer new];
    layer.frame = self.contentView.bounds;
    layer.path = path.CGPath;
    self.contentView.layer.mask = layer;
}

但我的 contentView 没有掩饰,而是完全消失了。我试着在调试器中查看 path,它看起来和我想要的一样。

使用layer.mask时,首先是获取正确的路径。你不需要每次都移动到一个新的点。那样的话,你的路径就是由三四个子路径组成的,这些子路径不能闭合形成一条正确的路径。

第二个尝试在视图 class 本身中使用,而不是调用其他子视图,如 contentView。因为你可能不知道什么时候在子视图中调用它。 运行 UIView subclass 中的以下内容,就像在 UITableViewCell 中一样(从 nib 唤醒)。你可以明白我的意思。如果你真的想使用contentView,只要找到合适的位置来放置你的层代码。比如覆盖 setNeedLayout 等

 - (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
[self createPath];
}


 - (void)createPath {   
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(0, 0)];
[path addLineToPoint:CGPointMake(100, 100)];
 //  [path moveToPoint:CGPointMake(100, 100)];
[path addLineToPoint:CGPointMake(0, 100)];
 //  [path moveToPoint:CGPointMake(0, 100)];
[path addLineToPoint:CGPointMake(0, 0)];
[path closePath];


CAShapeLayer *layer = [CAShapeLayer new];
layer.frame = self.contentView.bounds;
layer.path = path.CGPath;
self.layer.mask  = layer;  // not self.contentView.layer.mask;

}