在给view加阴影并且同时加圆角的时候,会遇到经典的masksToBounds问题,masksToBounds为YES或NO时,仅阴影或圆角生效,不能同时生效。为解决此问题,解决办法是加一层layer来实现。
要点:
1. shadow加到单独的layer上面,layer和view.layer同frame,并且是路经阴影额?,然后加到view的底层;
2. 在view的layer上面加cornerRadius。
具体如下:
PS:
1. label文案加阴影:
2. view加普通阴影:
3. view加普通路经阴影
要点:
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]; }
效果:
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; }