Alexandr Chekel
Alexandr Chekel

Reputation: 412

CAShapeLayer mask doesn't show up

I'm making mask using UIBezierPath and CAShapeLayer with this code:

- (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;
}

But instead of masking my contentView disappears completely. I tried to look at path in debugger and it looks exactly as I want it to look.

Upvotes: 0

Views: 218

Answers (1)

E.Coms
E.Coms

Reputation: 11531

When using the layer.mask, the first is to get the right path. You don't need to move to a new point every time. By that way, your path is made of three or four subpaths which can not be closed to form a right path.

The second is trying to use in the View class itself, not to call for other subviews, like contentView. Because you may not know when to call it in subviews. Run the following in a UIView subclass, like in a UITableViewCell (awake from nib). You can get what I mean. If you really want to use contentView, just find the right position to put your layer code. like override setNeedLayout, etc.

 - (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;

}

Upvotes: 1

Related Questions