ios - `UINavigationBar` 弯曲扩展?

标签 ios swift uiview uinavigationbar rounded-corners

在 Apple 的自定义 UINavigationBar 示例中,它们演示了通过覆盖导航栏底部并重新创建其投影来扩展导航栏以获得附加功能的可能性。 https://developer.apple.com/library/ios/samplecode/NavBar/Introduction/Intro.html

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

design mockup

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

由于设备尺寸各不相同,并且需要在不扭曲曲线的情况下对屏幕方向变化进行动画处理,是否有任何方法可以生成这种弯曲的UINavigationBar? p>

最佳答案

我目前唯一的方法是子类化 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)

    }
}

结果:

enter image description here

问题是添加的 pathLayer 会覆盖导航栏标题和按钮的图层。因此,如果将 pathLayer 的 fillColor 设置为非透明颜色,这些按钮和标题将不可见。

要解决此问题,您可以像我一样在添加 pathLayer 之后以编程方式添加标题和按钮,或者使用 insertSublayer 插入 pathLayer 在这篇文章中提到的按钮和标题后面 CALayer - Place sublayer below storyboard UIButtons?

关于ios - `UINavigationBar` 弯曲扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37782463/

相关文章:

ios - 自动调整掩码将 UIView 附加到屏幕底部而不是 UIScrollView

ios - 如何从 Storyboard创建的 UITableView 中拉出 UIView?

ios - 在 Parse.com 中存储 UIView

ios - UINavigationBar 无法更改颜色

iOS:定位服务列表中缺少应用程序

ios - swift 的 iOS。多行 UILabel 背景颜色跟随文本

ios - UIGestureRecognizer 的闭包

ios - 加载大文本文件的替代方案 - Swift

ios - TableView 在删除时不选择新行

ios - iAd 跨 View Controller (单例): Somehow not working