有时候,UI并不会给我们切带有阴影的图片,阴影就需要我们自己来做。(当然了,有图片是最好的)
举个栗子如图:
我们要给上图设置一个左侧的阴影,系统的方法
shadowOffset
可以满足,但是系统的方法只能设置单侧的阴影,我们需要多个方向变不可用。仔细观察,系统的阴影有个过渡的效果。所以我大胆猜测,如果自己实现左侧阴影的效果,实际上和上图阴影的区域是类似的。(这些在下面处理阴影的宽度有很大的关系)
通过shadowPath 实现局部阴影 ,因为系统的过渡效果,所以这个偏移为shadowPathWidth/2
self.layer.masksToBounds = NO;
self.layer.shadowColor = shadowColor.CGColor;
self.layer.shadowOpacity = shadowOpacity;
self.layer.shadowRadius = shadowRadius;
self.layer.shadowOffset = CGSizeZero;
因为系统的过渡效果,所以这个偏移为shadowPathWidth/2
CGRect shadowRect = CGRectMake(originX, originY - shadowPathWidth/2, originW, shadowPathWidth);
UIBezierPath *path =[UIBezierPath bezierPathWithRect:shadowRect];
self.layer.shadowPath = path.CGPath;
将常用的局部阴影效果封装为分类。
#import <UIKit/UIKit.h>
typedef enum :NSInteger{
LXShadowPathLeft,
LXShadowPathRight,
LXShadowPathTop,
LXShadowPathBottom,
LXShadowPathNoTop,
LXShadowPathAllSide
} LXShadowPathSide;
@interface UIView (LXShadowPath)
/*
* shadowColor 阴影颜色
*
* shadowOpacity 阴影透明度,默认0
*
* shadowRadius 阴影半径,默认3
*
* shadowPathSide 设置哪一侧的阴影,
* shadowPathWidth 阴影的宽度,
*/
-(void)LX_SetShadowPathWith:(UIColor *)shadowColor shadowOpacity:(CGFloat)shadowOpacity shadowRadius:(CGFloat)shadowRadius shadowSide:(LXShadowPathSide)shadowPathSide shadowPathWidth:(CGFloat)shadowPathWidth;
效果图:demo地址:UIView局部阴影