屏蔽CALayer - iPhone

时间:2010-02-15 17:18:33

标签: iphone animation calayer mask

我正在为iPhone创建一个自定义开/关切换开​​关(类似于标准开关),我正在设置滑块的蒙版,但调用[[myView layer] setMask:maskLayer]组掩模层相对于其掩蔽层的位置,而不是相对于掩模层的容器层。对于这种特殊情况,需要相对于包含图层设置遮罩层的位置,因为切换滑块将在遮罩下移动,遮罩应保持静止。

无需为蒙版和切换滑块组件设置动画以达到预期效果,任何人都知道如何使其工作?这是我到目前为止所得到的:

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
CGMutablePathRef path = CGPathCreateMutable();

CGPathAddEllipseInRect(path, nil, CGRectMake(0, 0, 13, 13));
CGPathAddEllipseInRect(path, nil, CGRectMake(30, 0, 13, 13));
CGPathAddRect(path, nil, CGRectMake(6, 0, 32, 13));

[maskLayer setPath:path];
[maskLayer setFillColor:[[UIColor greenColor] CGColor]];

[[self layer] addSublayer:maskLayer];

[maskLayer setPosition:CGPointMake(2, 2)];

[self addSubview:toggleView];

[[toggleView layer] setMask:maskLayer];

1 个答案:

答案 0 :(得分:14)

掩码只是一种特殊的子层,因此掩码的超层将始终是它所掩盖的层。没有其他办法了。此外,您在文档中违反了此警告:

  

将蒙版设置为新图层时,必须首先将新图层的超级图层设置为nil,否则行为未定义。

您应该删除[[self layer] addSublayer:maskLayer];行。

要解决您的问题,我会创建另一个图层或视图,其中包含现在在您的toggleView上的所有内容,然后将该图层作为子图层添加到您的toggleLayer中。这样,您可以独立于蒙版定位新的子图层,如果移动父图层,蒙版和子图层将一起移动(如果我理解正确的话,他们应该这样做。)