UIView周边加阴影,并且同时圆角

在给view加阴影并且同时加圆角的时候,会遇到经典的masksToBounds问题,masksToBounds为YES或NO时,仅阴影或圆角生效,不能同时生效。为解决此问题,解决办法是加一层layer来实现。
要点:
1. shadow加到单独的layer上面,layer和view.layer同frame,并且是路经阴影额?,然后加到view的底层;
2. 在view的layer上面加cornerRadius。
具体如下:
/*
 周边加阴影,并且同时圆角
 */
+ (void)addShadowToView:(UIView *)view
            withOpacity:(float)shadowOpacity
           shadowRadius:(CGFloat)shadowRadius
        andCornerRadius:(CGFloat)cornerRadius
{
     shadow /
    CALayer *shadowLayer = [CALayer layer];
    shadowLayer.frame = view.layer.frame;
    
    shadowLayer.shadowColor = [UIColor blackColor].CGColor;//shadowColor阴影颜色
    shadowLayer.shadowOffset = CGSizeMake(0, 0);//shadowOffset阴影偏移,默认(0, -3),这个跟shadowRadius配合使用
    shadowLayer.shadowOpacity = shadowOpacity;//0.8;//阴影透明度,默认0
    shadowLayer.shadowRadius = shadowRadius;//8;//阴影半径,默认3
    
    //路径阴影
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    float width = shadowLayer.bounds.size.width;
    float height = shadowLayer.bounds.size.height;
    float x = shadowLayer.bounds.origin.x;
    float y = shadowLayer.bounds.origin.y;
    
    CGPoint topLeft      = shadowLayer.bounds.origin;
    CGPoint topRight     = CGPointMake(x + width, y);
    CGPoint bottomRight  = CGPointMake(x + width, y + height);
    CGPoint bottomLeft   = CGPointMake(x, y + height);
    
    CGFloat offset = -1.f;
    [path moveToPoint:CGPointMake(topLeft.x - offset, topLeft.y + cornerRadius)];
    [path addArcWithCenter:CGPointMake(topLeft.x + cornerRadius, topLeft.y + cornerRadius) radius:(cornerRadius + offset) startAngle:M_PI endAngle:M_PI_2 * 3 clockwise:YES];
    [path addLineToPoint:CGPointMake(topRight.x - cornerRadius, topRight.y - offset)];
    [path addArcWithCenter:CGPointMake(topRight.x - cornerRadius, topRight.y + cornerRadius) radius:(cornerRadius + offset) startAngle:M_PI_2 * 3 endAngle:M_PI * 2 clockwise:YES];
    [path addLineToPoint:CGPointMake(bottomRight.x + offset, bottomRight.y - cornerRadius)];
    [path addArcWithCenter:CGPointMake(bottomRight.x - cornerRadius, bottomRight.y - cornerRadius) radius:(cornerRadius + offset) startAngle:0 endAngle:M_PI_2 clockwise:YES];
    [path addLineToPoint:CGPointMake(bottomLeft.x + cornerRadius, bottomLeft.y + offset)];
    [path addArcWithCenter:CGPointMake(bottomLeft.x + cornerRadius, bottomLeft.y - cornerRadius) radius:(cornerRadius + offset) startAngle:M_PI_2 endAngle:M_PI clockwise:YES];
    [path addLineToPoint:CGPointMake(topLeft.x - offset, topLeft.y + cornerRadius)];
    
    //设置阴影路径
    shadowLayer.shadowPath = path.CGPath;
    
     cornerRadius /
    view.layer.cornerRadius = cornerRadius;
    view.layer.masksToBounds = YES;
    view.layer.shouldRasterize = YES;
    view.layer.rasterizationScale = [UIScreen mainScreen].scale;
    
    [view.superview.layer insertSublayer:shadowLayer below:view.layer];
}

效果:


PS:
1. label文案加阴影:
- (void)addShadowForPlaceHolder
{
    if (!(_placeHolderLabel.text.length > 0)) {
        return;
    }
    
    NSShadow *shadow = [NSShadow new];
    shadow.shadowBlurRadius = 0.5f;
    shadow.shadowOffset = CGSizeMake(0.0f, 0.5f);
    shadow.shadowColor = [[UIColor blackColor] colorWithAlphaComponent:0.4f];
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:_placeHolderLabel.text attributes:@{NSShadowAttributeName : shadow}];
    _placeHolderLabel.attributedText = attributedText;
}


2. view加普通阴影:
    _descTextView = [UITextView new];
    _descTextView.textColor = kCZUIWhiteColor;
    _descTextView.font = _fontLarge;
    _descTextView.scrollEnabled = NO;
    _descTextView.text = _liveDesc;
    _descTextView.translatesAutoresizingMaskIntoConstraints = NO;
    _descTextView.delegate = self;
    _descTextView.textContainerInset = UIEdgeInsetsZero;
    CZ_SetUIViewBackgroundColor(_descTextView, _placeHolderLabel.backgroundColor);
    _descTextView.enablesReturnKeyAutomatically = NO;
    _descTextView.layer.shadowColor = [UIColor blackColor].CGColor;
    _descTextView.layer.shadowOpacity = 0.4;
    _descTextView.layer.shadowRadius = 0.5f;
    _descTextView.layer.shadowOffset = CGSizeMake(0.0f, 0.5f);
    _descTextView.layer.shouldRasterize = YES;
    _descTextView.layer.rasterizationScale = CZ_MainScreen().scale;

3. view加普通路经阴影
- (void)addShadow:(UIView *)view
{
    view.layer.shadowColor = [UIColor blackColor].CGColor;//shadowColor阴影颜色
    view.layer.shadowOffset = CGSizeMake(0, 0);//shadowOffset阴影偏移,默认(0, -3),这个跟shadowRadius配合使用
    view.layer.shadowOpacity = 0.3;//0.8;//阴影透明度,默认0
    view.layer.shadowRadius = 2;//8;//阴影半径,默认3
    
    //路径阴影
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    float width = view.bounds.size.width;
    float height = view.bounds.size.height;
    float x = view.bounds.origin.x;
    float y = view.bounds.origin.y;
    
    CGPoint topLeft      = view.bounds.origin;
    CGPoint topRight     = CGPointMake(x + width, y);
    CGPoint bottomRight  = CGPointMake(x + width, y + height);
    CGPoint bottomLeft   = CGPointMake(x, y + height);
    
    CGFloat offset = 0.f;
    [path moveToPoint:CGPointMake(topLeft.x - offset, topLeft.y - offset)];
    [path addLineToPoint:CGPointMake(topRight.x + offset, topRight.y - offset)];
    [path addLineToPoint:CGPointMake(bottomRight.x + offset, bottomRight.y + offset)];
    [path addLineToPoint:CGPointMake(bottomLeft.x - offset, bottomLeft.y + offset)];
    [path addLineToPoint:CGPointMake(topLeft.x - offset, topLeft.y - offset)];
    
    //设置阴影路径
    view.layer.shadowPath = path.CGPath;
}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值