Ios 自定义导航栏不是矩形的

Ios 自定义导航栏不是矩形的,ios,swift,xcode,uinavigationcontroller,storyboard,Ios,Swift,Xcode,Uinavigationcontroller,Storyboard,是否可以自定义导航栏,使其看起来如下图所示?很明显,它的背景是透明的,不是灰色的 我试过: UINavigationBar.appearance().setBackgroundImage(UIImage(named:"pattern.png"), for: .default) 这似乎捕捉到了颜色,但不是导航栏的格式 我试图避免创建带有UIView或类似内容的自定义导航栏,

是否可以自定义导航栏,使其看起来如下图所示?很明显,它的背景是透明的,不是灰色的

我试过:

UINavigationBar.appearance().setBackgroundImage(UIImage(named:"pattern.png"),
                                                            for: .default)
这似乎捕捉到了颜色,但不是导航栏的格式

我试图避免创建带有UIView或类似内容的自定义导航栏,因为这意味着需要为这么小的更改做很多额外的工作。我的应用程序有很多使用导航控制器的视图

提前谢谢

我试图避免创建带有UIView或 诸如此类的事情,因为这意味着你要做很多额外的工作 这么小的变化。我的应用程序有很多使用导航的视图 控制器

子类
UINavigationController
,并在其中包含的
UINavigationBar
上实现自定义视图

然后,在应用程序中有导航控制器的任何地方,将其类替换为自定义子类

例如:

class MyCustomNavigationController: UINavigationController {

    override func viewDidLoad() {
        // ... code to implement custom view
        // you may not necessarily want to put it in viewDidLoad...
    }

}

这样,您只需编写一次自定义视图代码。作为导航栏的自定义视图很可能是实现所需内容的唯一方法。

使用此选项可将之字形图案添加到导航栏(版本2),或者您可以使用所需图案创建自定义UIImage(版本1(收藏夹)

版本1使用UIImage并使用self.navigationController?.navigationBar.setBackgroundImage方法 获取图像

import UIKit

extension UIImage {
    
    static func pathZigZagForCGRect(rect: CGRect) ->UIBezierPath
    {
        let width = rect.size.width
        let height = rect.size.height
        
        let zigZagWidth = CGFloat(7)
        let zigZagHeight = CGFloat(5)
        var yInitial = height-zigZagHeight
        
        var zigZagPath = UIBezierPath()
        zigZagPath.move(to: CGPoint(x:0, y:0))
        zigZagPath.addLine(to: CGPoint(x:0, y:yInitial))
        
        var slope = -1
        var x = CGFloat(0)
        var i = 0
        while x < width {
            x = zigZagWidth * CGFloat(i)
            let p = zigZagHeight * CGFloat(slope) - 5
            let y = yInitial + p
            let point = CGPoint(x: x, y: y)
            zigZagPath.addLine(to: point)
            slope = slope*(-1)
            i += 1
        }
        
        zigZagPath.addLine(to: CGPoint(x:width,y: 0))
        zigZagPath.addLine(to: CGPoint(x:0,y: 0))
        zigZagPath.close()
        return zigZagPath
    }
    

    static func zigZagImage(rect: CGRect,color:UIColor)->UIImage {
        
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        var ctx = UIGraphicsGetCurrentContext()!
        ctx.clear(CGRect(x: 0, y: 0, width: rect.size.width, height: rect.size.height))
        
        ctx.setFillColor(color.cgColor)
        let path = UIImage.pathZigZagForCGRect(rect: rect)
        ctx.addPath(path.cgPath)
        ctx.fillPath()
        //draw triangle
        
        let img = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        
        return img
    }
    
}
结果

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.navigationController?.navigationBar.setBackgroundImage( UIImage.zigZagImage(rect: CGRect(x: 0, y: 0, width: (self.navigationController?.navigationBar.frame.size.width)!, height: (self.navigationController?.navigationBar.frame.height)! + 20),color:UIColor.red).resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch), for: .default)
    }
override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.navigationController?.navigationBar.backgroundColor = UIColor.red
        self.applyZigZagEffect(givenView: (self.navigationController?.navigationBar)!)
    }

使用layerMask的版本2 希望这对你有帮助

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.navigationController?.navigationBar.backgroundColor = UIColor.red
        self.applyZigZagEffect(givenView: (self.navigationController?.navigationBar)!)
    }