Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ios中塑造导航栏?_Ios_Objective C_Swift - Fatal编程技术网

如何在ios中塑造导航栏?

如何在ios中塑造导航栏?,ios,objective-c,swift,Ios,Objective C,Swift,是否可以在iOS中设置导航栏的形状,如下图所示。我有多个类似于此图像的屏幕。我不想在所有视图中添加图像。我想做一些普通的事情 如果是,请告诉我怎么做 我有一个项目与你的问题相同,但它们的渐变颜色是垂直对齐的。 您可以参考我的代码: class _BackgroundView: UIView { var radius: CGFloat = 28 { didSet { setNeedsDisplay() } } va

是否可以在iOS中设置导航栏的形状,如下图所示。我有多个类似于此图像的屏幕。我不想在所有视图中添加图像。我想做一些普通的事情

如果是,请告诉我怎么做

我有一个项目与你的问题相同,但它们的渐变颜色是垂直对齐的。 您可以参考我的代码:

class _BackgroundView: UIView {

    var radius: CGFloat = 28 {
        didSet {
            setNeedsDisplay()
        }
    }

    var startColor = UIColor(red: 51/255, green: 115/255, blue: 199/255, alpha: 1)
    var endColor = UIColor(red: 46/255, green: 187/255, blue: 228/255, alpha: 1)

    var barHeight: CGFloat = 44

    @available(iOS 11.0, *)
    override func safeAreaInsetsDidChange() {
        super.safeAreaInsetsDidChange()
        setNeedsDisplay()
    }

    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
        context.saveGState()

        context.clear(rect)

        let colorSpace = CGColorSpaceCreateDeviceRGB()

        guard let startColorComponents = startColor.cgColor.components else {
            return
        }
        guard let endColorComponents = endColor.cgColor.components else {
            return
        }

        let colorComponents: [CGFloat] = [startColorComponents[0], startColorComponents[1], startColorComponents[2], startColorComponents[3], endColorComponents[0], endColorComponents[1], endColorComponents[2], endColorComponents[3]]

        let locations:[CGFloat] = [0.0, 1.0]

        guard let gradient = CGGradient(colorSpace: colorSpace,colorComponents: colorComponents,locations: locations,count: 2) else { return }

        let startPoint = CGPoint(x: 0, y: 0)
        var endPoint: CGPoint
        if #available(iOS 11.0, *) {
            endPoint = CGPoint(x: rect.width, y: safeAreaInsets.top + barHeight + radius)
        } else {
            endPoint = CGPoint(x: rect.width, y: UIApplication.shared.statusBarFrame.height + barHeight + radius)
        }

        context.saveGState()
        context.addRect(CGRect(x: 0, y: 0, width: rect.width, height: endPoint.y))
        context.clip()
        context.drawLinearGradient(gradient, start: startPoint, end: endPoint, options: CGGradientDrawingOptions(rawValue: UInt32(0)))
        context.restoreGState()

        let y: CGFloat
        if #available(iOS 11.0, *) {
            y = safeAreaInsets.top + barHeight
        } else {
            y = UIApplication.shared.statusBarFrame.height + barHeight
        }
        let roundRect = CGRect(x: 0, y: y, width: rect.width, height: rect.height - y)
        let path = UIBezierPath(roundedRect: roundRect, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(w: radius, h: radius))
        UIColor.white.setFill()
        path.fill()
        context.addPath(path.cgPath)

        context.restoreGState()
    }

}

如何使用此代码?@Maulikshah您应该隐藏navigationController的navigationBar,重写loadView函数,然后设置view=\u BackgroundView(),但我需要navigationBar,因为每个视图都有标题和后退按钮您可以按代码添加后退按钮和标题,我为您的项目spaceall视图添加
barHeight
属性,您可以使用形状导航为所有控制器创建
BaseViewController