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)!)
}