微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 仅将CALayer阴影屏蔽到rect之外

我如何用阴影掩盖CALayer,以便阴影只在路径之外?我不希望透明视图背后的阴影.
shadowLayer.shadowOffset = CGSizeMake(x,y);
shadowLayer.shadowRadius = radius;
shadowLayer.shadowOpacity = opacity;
shadowLayer.shadowColor = color.CGColor;
shadowLayer.shadowPath = [UIBezierPath bezierPathWithRect:view.bounds].CGPath;

谢谢.

解决方法

我会回答我自己的问题.为视图添加新的阴影层.如果设置正确,这应适用于任何shadowPath.
float radius = 8;
float opacity = 0.5f;
float x = 4;
float y = 6;
UIColor *color = [UIColor blackColor];

// Shadow layer
CALayer *shadowLayer = [CALayer layer];
shadowLayer.shadowOffset = CGSizeMake(x,y);
shadowLayer.shadowRadius = radius;
shadowLayer.shadowOpacity = opacity;
shadowLayer.shadowColor = color.CGColor;
shadowLayer.shadowPath = [UIBezierPath bezierPathWithRect:view.frame].CGPath; // Or any other path

// Shadow mask frame
CGRect frame = CGRectInset(view.layer.frame,-2*radius,-2*radius);
frame = CGRectOffset(frame,x,y);

// Translate shadowLayer shadow path to mask layer's coordinate system
CGAffineTransform trans = CGAffineTransformMakeTranslation(-view.frame.origin.x-x+2*radius,-view.frame.origin.y-y+2*radius);

// Mask path
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path,nil,(CGRect){.origin={0,0},.size=frame.size});
CGPathAddpath(path,&trans,shadowLayer.shadowPath);
CGPathCloseSubpath(path);

// Mask layer
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = frame;
maskLayer.fillRule = kCAFillRuleEvenOdd;
maskLayer.path = path;

shadowLayer.mask = maskLayer;

[view.layer.superlayer insertSublayer:shadowLayer below:view.layer];

原文地址:https://www.jb51.cc/iOS/328741.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐