主要是使用UIBezierPath贝塞尔曲线设置阴影路径。
路径还是比较规则的,就是直线加一个圆弧;而UIBezierPath对象画直线和圆弧都是比较简单的。
稍微有一点拐弯的地方就是圆弧的起始角度和结束角度要计算下。
计算圆弧起始角度和结束角度
图中结果很明显
{\sin\alpha = a/r} ; \alpha = \arcsin(a/r)
很明显起始角度:π+α 结束角度:2π - α
下面是完整代码:
/**
给tabbar添加阴影,中间有一个圆形的凸起
@param center 圆弧中心
@param radius 圆弧半径
*/
-(void)setTabBarShadowWithCenter:(CGPoint)center radius:(CGFloat)radius {
CAShapeLayer *layer = [CAShapeLayer new];
//背景填充色
layer.fillColor = [UIColor whiteColor].CGColor;
layer.shadowColor = [UIColor colorWithRGBHex:0x1D1B27 alpha:0.3].CGColor;
layer.shadowOffset = CGSizeMake(0, -4);
layer.shadowOpacity = 0.5;
CGFloat a = center.y;
CGFloat angle = asin(a/radius);
//初始化一个路径
UIBezierPath* path = [UIBezierPath bezierPath];
//线条拐角
path.lineCapStyle = kCGLineCapRound;
//起点
[path moveToPoint:CGPointMake(0, 0)];
//绘制一条圆弧
[path addArcWithCenter:center radius:radius startAngle:angle + M_PI endAngle:2*M_PI - angle clockwise:YES];
[path addLineToPoint:CGPointMake(kScreenWidth, 0)];
[path addLineToPoint:CGPointMake(kScreenWidth, kSafeAreaBottomHeight)];
[path addLineToPoint:CGPointMake(0, kSafeAreaBottomHeight)];
// 根据坐标点连线
// [path stroke];
layer.path = [path CGPath];
[path closePath];
layer.shadowPath = [path CGPath];
[self.layer insertSublayer:layer atIndex:0];
}