给tabbar添加阴影,中间有一个圆形的凸起

主要是使用UIBezierPath贝塞尔曲线设置阴影路径。

路径还是比较规则的,就是直线加一个圆弧;而UIBezierPath对象画直线和圆弧都是比较简单的。

稍微有一点拐弯的地方就是圆弧的起始角度和结束角度要计算下。

计算圆弧起始角度和结束角度

给tabbar添加阴影,中间有一个圆形的凸起_第1张图片
屏幕快照 2018-07-30 下午4.58.21.png

图中结果很明显
{\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];
}

你可能感兴趣的:(给tabbar添加阴影,中间有一个圆形的凸起)