我现在唯一的方法是继承UINavigationBar并使用CAShapeLayer绘制你想要的形状:
import UIKit
class CustomNavigationBar: UINavigationBar {
var pathLayer: CAShapeLayer?
init() {
super.init(frame: CGRectZero)
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
override func drawRect(rect: CGRect) {
super.drawRect(rect)
}
func setup() {
var bezierPath = UIBezierPath()
bezierPath.moveToPoint(CGPointMake(0.0, 31.47))
bezierPath.addCurveToPoint(CGPointMake(186.72, 42.5), controlPoint1: CGPointMake(0.5, 31.47), controlPoint2: CGPointMake(93.22, 42.5))
bezierPath.addCurveToPoint(CGPointMake(375, 31.47), controlPoint1: CGPointMake(280.22, 42.5), controlPoint2: CGPointMake(375, 31.47))
bezierPath.addLineToPoint(CGPointMake(375, -0.5))
bezierPath.addLineToPoint(CGPointMake(0.5, -0.5))
bezierPath.addLineToPoint(CGPointMake(0.0, 31.47))
UIColor.blackColor().setStroke()
bezierPath.lineWidth = 1
bezierPath.stroke()
pathLayer = CAShapeLayer()
pathLayer?.fillColor = UIColor.lightGrayColor().CGColor
pathLayer?.path = bezierPath.CGPath
pathLayer?.lineWidth = 1.0
pathLayer?.strokeColor = UIColor.blackColor().CGColor
layer.addSublayer(pathLayer!)
let title = UILabel(frame: CGRect(x: 0, y: 0, width: 60, height: 30))
title.text = "Title"
title.textAlignment = .Center
title.center = self.center
addSubview(title)
}
}
结果:
问题是添加的pathLayer 会覆盖导航栏的标题和按钮层。所以如果你将pathLayer的fillColor设置为透明色以外的颜色,这些按钮和标题将是不可见的。
要解决此问题,您可以像我一样在添加pathLayer 之后以编程方式添加标题和按钮,或者使用insertSublayer 在按钮和标题后面插入pathLayer,如本文@987654322 中所述@