我就出来了,现在是继承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
在这篇文章中提到CALayer - Place sublayer below storyboard UIButtons?
'UIBezierPath' ? – jtbandes
http://stackoverflow.com/questions/25569210/uinavigationcontroller-with-custom-shape-navigation-bar这可能有助于 – iAnurag
@iAuurag与背景图像,鉴于我提到的约束(处理旋转和各种屏幕尺寸动态)... –