iOS 知识点iOSios

iOS 给layer同时添加mask和shadow

2017-04-11  本文已影响1874人  萌小菜

分别单独给layer设置圆角和阴影都是比较简单的,在这里就不多说了。而如果同时给layer添加mask和阴影就会有问题,因为设置mask后阴影也会被切掉。而我们需要的是他们共存,为了解决这个问题我在网上找到了以下方法:
IOS view的圆角和阴影并存
iOS how-to mask and shadow an image
如何让阴影和圆角同时实现

但是上面的方法要么就是太麻烦,要么就是不符合我们的要求,下面介绍下我给出的一种方法:
自定义view,修改其layerClass为CAShapeLayer, 代码如下:

// .h
#import <UIKit/UIKit.h>
@interface ShapeView : UIView

@end

// .m
@implementation ShapeView

+ (Class)layerClass {
    return [CAShapeLayer class];
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        ((CAShapeLayer *)self.layer).fillColor = [UIColor colorWithRed:0 green:1 blue:1 alpha:1.0].CGColor;
    }
    return self;
}

-(void)layoutSubviews{
    [super layoutSubviews];
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerBottomLeft cornerRadii:CGSizeMake(10,10)];
    ((CAShapeLayer *)self.layer).path = maskPath.CGPath;
    
}

- (void)setBackgroundColor:(UIColor *)backgroundColor {
    ((CAShapeLayer *)self.layer).fillColor = backgroundColor.CGColor;
}
@end

然后可以随心所欲的设置阴影了,并且不受mask的影响:

    ShapeView* shapeView = [[ShapeView alloc] init];
    shapeView.backgroundColor = [UIColor grayColor];
    shapeView.layer.shadowColor = [UIColor redColor].CGColor;
    shapeView.layer.shadowRadius = 5.f;
    shapeView.layer.shadowOffset = CGSizeMake(0.f, 0.f);
    shapeView.layer.shadowOpacity = 1.f;
    shapeView.frame = CGRectMake(100, 200, 500, 100);
    [self.view addSubview:shapeView];

如果再想设置border,可以用下面方法:

    // 这个地方的path和自定义view的layer的path相同
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:shapeView.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerBottomLeft cornerRadii:CGSizeMake(10,10)];
    CAShapeLayer* borderLayer = [CAShapeLayer layer];
    borderLayer.path = maskPath.CGPath;
    borderLayer.fillColor = [UIColor clearColor].CGColor;
    borderLayer.strokeColor = [UIColor greenColor].CGColor;
    borderLayer.frame = shapeView.bounds;
    [shapeView.layer addSublayer:borderLayer];

想要的效果就出来了,阴影、圆角、边框俱全:

如果你有更好的方法,欢迎留言交流。

参考: CALayer的autolayout

上一篇 下一篇

猜你喜欢

热点阅读