Ios `UINavigationBar'曲线延伸?

Ios `UINavigationBar'曲线延伸?,ios,swift,uiview,uinavigationbar,rounded-corners,Ios,Swift,Uiview,Uinavigationbar,Rounded Corners,在苹果定制UINavigationBar的示例中,他们展示了通过覆盖导航栏底部并重新创建其下拉阴影来扩展导航栏以实现附加功能的可能性。 我希望这样做,但有一个弯曲的延伸。换句话说,一个半圆使整个UINavigationBar看起来像是一个大圆的一部分见附件: 到目前为止,我考虑的唯一可能的方法是制作一个非常大但包含的UIView,并使用一个大的角半径来模拟此曲线。我做了一个测试,但发现当UIView的大小超过一定的大小阈值/比率时,边缘开始扭曲,看起来非常糟糕,因为有一个巨大但被剪裁的UIV

在苹果定制
UINavigationBar
的示例中,他们展示了通过覆盖导航栏底部并重新创建其下拉阴影来扩展导航栏以实现附加功能的可能性。

我希望这样做,但有一个弯曲的延伸。换句话说,一个半圆使整个
UINavigationBar
看起来像是一个大圆的一部分见附件:

到目前为止,我考虑的唯一可能的方法是制作一个非常大但包含的
UIView
,并使用一个大的角半径来模拟此曲线。我做了一个测试,但发现当
UIView
的大小超过一定的大小阈值/比率时,边缘开始扭曲,看起来非常糟糕,因为有一个巨大但被剪裁的
UIView
,效率很低,也很奇怪


由于设备大小不同,屏幕方向的变化需要在不扭曲曲线的情况下设置动画,是否有任何方法可以生成这种弯曲的
UINavigationBar

目前我提出的唯一方法是对
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
,如本文所述help@iAnurag那是背景图像,考虑到我提到的限制(用于动态处理旋转和各种屏幕大小)…@jtbandes我正在考虑
UIBezierPath
,但我不确定如何在这种情况下使其工作。嗯,这是否必须在
UINavigationBar
的范围内?不,它可能超出
UINavigationBar