class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupNavItems(navigationItem, day: "Today", address: "Madiwla Bangalore", type: 1, isMenuBtn: true, rightBtnType: 1, title: "")
}
func setupNavItems(_ navigationCustonItem : UINavigationItem,
day:String = "",address:String = "",type:Int,isMenuBtn:Bool,rightBtnType:Int,title:String = "") {
self.navigationController?.isNavigationBarHidden = false
navigationController?.navigationBar.backgroundColor = .green
navigationController?.navigationBar.isTranslucent = false
let height = navigationController?.navigationBar.frame.height ?? 0
let topButtonsWidth: CGFloat = 90 // left padding
let width2 = 300 - topButtonsWidth
let estimatedLeftViewWidth = min( width2/2 ,100)
let rightSapacing : CGFloat = 5.0
if type == 1 {
let Titleview = UIView(frame: CGRect(x: 0, y: 0, width: width2, height: height))
Titleview.backgroundColor = .clear
navigationCustonItem.titleView = Titleview
let leftView = UILabel()
leftView.text = day
leftView.textColor = .white
leftView.textAlignment = .center
leftView.backgroundColor = .clear
Titleview.addSubview(leftView)
leftView.translatesAutoresizingMaskIntoConstraints = false
leftView.leadingAnchor.constraint(equalTo: Titleview.leadingAnchor, constant: rightSapacing).isActive = true
leftView.centerYAnchor.constraint(equalTo: Titleview.centerYAnchor).isActive = true
leftView.widthAnchor.constraint(equalToConstant: estimatedLeftViewWidth).isActive = true
let dottedLine = UIView()
Titleview.addSubview(dottedLine)
dottedLine.translatesAutoresizingMaskIntoConstraints = false
dottedLine.leadingAnchor.constraint(equalTo: leftView.leadingAnchor, constant: rightSapacing).isActive = true
dottedLine.topAnchor.constraint(equalTo: leftView.bottomAnchor).isActive = true
dottedLine.widthAnchor.constraint(equalTo: leftView.widthAnchor).isActive = true
dottedLine.heightAnchor.constraint(equalToConstant: 2).isActive = true
let DirectImag = UIImageView()
DirectImag.contentMode = .scaleAspectFit
Titleview.addSubview(DirectImag)
DirectImag.translatesAutoresizingMaskIntoConstraints = false
DirectImag.widthAnchor.constraint(equalToConstant: 15).isActive = true
DirectImag.heightAnchor.constraint(equalToConstant: 15).isActive = true
DirectImag.leadingAnchor.constraint(equalTo: leftView.trailingAnchor, constant:0).isActive = true
DirectImag.centerYAnchor.constraint(equalTo: leftView.centerYAnchor).isActive = true
let dayBtn = UIButton()
dayBtn.addTarget(self, action: #selector(self.btnClickASAPType), for: .touchUpInside)
dayBtn.backgroundColor = .clear
Titleview.addSubview(dayBtn)
dayBtn.translatesAutoresizingMaskIntoConstraints = false
dayBtn.leadingAnchor.constraint(equalTo: Titleview.leadingAnchor, constant: rightSapacing).isActive = true
dayBtn.centerYAnchor.constraint(equalTo: Titleview.centerYAnchor).isActive = true
dayBtn.widthAnchor.constraint(equalToConstant: estimatedLeftViewWidth).isActive = true
dayBtn.heightAnchor.constraint(equalToConstant: height).isActive = true
let rightView = UIView()
rightView.backgroundColor = .clear
Titleview.addSubview(rightView)
rightView.translatesAutoresizingMaskIntoConstraints = false
rightView.centerYAnchor.constraint(equalTo: Titleview.centerYAnchor).isActive = true
rightView.leadingAnchor.constraint(equalTo: DirectImag.trailingAnchor, constant: 5).isActive = true
rightView.heightAnchor.constraint(equalToConstant: height).isActive = true
rightView.trailingAnchor.constraint(equalTo: Titleview.trailingAnchor).isActive = true
let downImag = UIImageView()
downImag.contentMode = .scaleAspectFit
rightView.addSubview(downImag)
downImag.translatesAutoresizingMaskIntoConstraints = false
downImag.widthAnchor.constraint(equalToConstant: 15).isActive = true
downImag.heightAnchor.constraint(equalToConstant: 15).isActive = true
downImag.trailingAnchor.constraint(equalTo: rightView.trailingAnchor, constant:0).isActive = true
downImag.centerYAnchor.constraint(equalTo: rightView.centerYAnchor).isActive = true
let addLbl = UILabel()
addLbl.text = address
addLbl.textColor = .white
addLbl.textAlignment = .center
rightView.addSubview(addLbl)
addLbl.translatesAutoresizingMaskIntoConstraints = false
addLbl.leadingAnchor.constraint(equalTo: rightView.leadingAnchor).isActive = true
//addLbl.heightAnchor.constraint(equalToConstant: height).isActive = true
addLbl.centerYAnchor.constraint(equalTo: rightView.centerYAnchor).isActive = true
addLbl.trailingAnchor.constraint(equalTo: downImag.leadingAnchor, constant: 0).isActive = true
let addressBtn = UIButton(type: .system)
addressBtn.backgroundColor = .clear
addressBtn.addTarget(self, action: #selector(self.btnClickAddress), for: .touchUpInside)
rightView.addSubview(addressBtn)
addressBtn.translatesAutoresizingMaskIntoConstraints = false
addressBtn.centerYAnchor.constraint(equalTo: rightView.centerYAnchor).isActive = true
addressBtn.centerXAnchor.constraint(equalTo: rightView.centerXAnchor, constant: 0).isActive = true
addressBtn.heightAnchor.constraint(equalToConstant: height).isActive = true
addressBtn.widthAnchor.constraint(equalToConstant: width2 - estimatedLeftViewWidth).isActive = true
// addressBtn.backgroundColor = .black
let dottedAddLine = UIView()
Titleview.addSubview(dottedAddLine)
dottedAddLine.translatesAutoresizingMaskIntoConstraints = false
dottedAddLine.leadingAnchor.constraint(equalTo: addLbl.leadingAnchor, constant: rightSapacing).isActive = true
dottedAddLine.topAnchor.constraint(equalTo: addLbl.bottomAnchor).isActive = true
dottedAddLine.widthAnchor.constraint(equalTo: addLbl.widthAnchor).isActive = true
dottedAddLine.heightAnchor.constraint(equalToConstant: 2).isActive = true
}
else if type == 2{
let dayLbl = UILabel()
dayLbl.text = title
dayLbl.textColor = .white
dayLbl.textAlignment = .center
navigationItem.title = title
}else if type == 3 {
let Titleview = UIView()
Titleview.backgroundColor = .clear
navigationItem.titleView = Titleview
let textFieldView = UITextField()
textFieldView.attributedPlaceholder = NSAttributedString(string: "Search in Pizza Max", attributes: [NSAttributedString.Key.foregroundColor : UIColor.white])
Titleview.addSubview(textFieldView)
textFieldView.translatesAutoresizingMaskIntoConstraints = false
textFieldView.leadingAnchor.constraint(equalTo: Titleview.leadingAnchor).isActive = true
textFieldView.trailingAnchor.constraint(equalTo: Titleview.trailingAnchor).isActive = true
textFieldView.topAnchor.constraint(equalTo: Titleview.topAnchor).isActive = true
textFieldView.bottomAnchor.constraint(equalTo: Titleview.bottomAnchor,constant: -5).isActive = true
textFieldView.heightAnchor.constraint(equalToConstant: height - 5).isActive = true
textFieldView.widthAnchor.constraint(equalToConstant: width2 - 20).isActive = true
/// textFieldView.addTarget(self, action: #selector(self.textChanged(_:)), for: .editingChanged)
let viewBorder = UIView()
viewBorder.backgroundColor = .white
Titleview.addSubview(viewBorder)
viewBorder.translatesAutoresizingMaskIntoConstraints = false
viewBorder.leadingAnchor.constraint(equalTo: textFieldView.leadingAnchor).isActive = true
viewBorder.trailingAnchor.constraint(equalTo: textFieldView.trailingAnchor).isActive = true
viewBorder.topAnchor.constraint(equalTo: textFieldView.bottomAnchor,constant: 0).isActive = true
viewBorder.heightAnchor.constraint(equalToConstant: 1).isActive = true
viewBorder.widthAnchor.constraint(equalTo: textFieldView.widthAnchor).isActive = true
}
reightMenuItems(isMenuBtn, navigationCustonItem)
leftMenuItems(rightBtnType, navigationCustonItem)
}
fileprivate func reightMenuItems(_ isMenuBtn: Bool, _ navigationItem: UINavigationItem) {
//reigtButtons
if isMenuBtn {
let leftView = UIView()
leftView.backgroundColor = .clear
leftView.frame = CGRect(x: 0, y: 0, width: 40, height: 44)
let menuImage = UIImageView()
menuImage.contentMode = .scaleAspectFit
menuImage.frame = CGRect(x: 4, y: 8, width: 32, height: 28)
leftView.addSubview(menuImage)
let followButton = UIButton(type: .system)
followButton.frame = CGRect(x: 0, y: 0, width: 40, height: 44)
followButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: -20, bottom: 0, right: 0)
followButton.addTarget(self, action: #selector(self.btnClickMenu), for: .touchUpInside)
leftView.addSubview(followButton)
navigationItem.leftBarButtonItems = [UIBarButtonItem(customView: leftView)]
}else{
let leftView = UIView()
leftView.backgroundColor = .clear
leftView.frame = CGRect(x: 0, y: 0, width: 40, height: 44)
let menuImage = UIImageView()
menuImage.contentMode = .scaleToFill
menuImage.frame = CGRect(x: 5, y: 10.5, width: 15, height: 25)
leftView.addSubview(menuImage)
let followButton = UIButton(type: .system)
followButton.frame = CGRect(x: 0, y: 0, width: 40, height: 44)
leftView.addSubview(followButton)
followButton.addTarget(self, action: #selector(self.btnClickBack), for: .touchUpInside)
navigationItem.leftBarButtonItems = [UIBarButtonItem(customView: leftView)]
}
}
fileprivate func leftMenuItems(_ rightBtnType: Int, _ navigationItem: UINavigationItem) {
//lecftButtons
switch rightBtnType {
case 1:
let reightView = UIView()
reightView.backgroundColor = .clear
reightView.frame = CGRect(x: 0, y: 0, width: 40, height: 44)
let menuImage = UIImageView()
menuImage.contentMode = .scaleToFill
menuImage.frame = CGRect(x: 4.5, y: 7, width: 31, height: 30)
reightView.addSubview(menuImage)
let cartBtn = UIButton(type: .system)
cartBtn.frame = CGRect(x: 0, y: 0, width: 40, height: 44)
reightView.addSubview(cartBtn)
cartBtn.addTarget(self, action: #selector(self.btnClickCart), for: .touchUpInside)
navigationItem.rightBarButtonItems = [UIBarButtonItem(customView: reightView)]
case 2:
let composeButton = UIButton()
composeButton.setTitle("Done", for: .normal)
composeButton.titleLabel?.textColor = .white
composeButton.frame = CGRect(x: 0, y: 00, width: 34, height: 44)
composeButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 0)
composeButton.addTarget(self, action: #selector(self.btnclickDone), for: .touchUpInside)
navigationItem.rightBarButtonItems = [UIBarButtonItem(customView: composeButton)]
default:
break
}
}
@IBAction func btnClickASAPType(_ sender : UIButton) {
print("DayExt")
// self.overriderFunc()
}
@objc func btnClickAddress() {
print("AddressExt")
}
@objc func handleAddressTap(_ sender: UITapGestureRecognizer) {
print("Hello World")
}
@objc public func btnClickCart() {
print("CartExt")
self.performSegue(withIdentifier: "q", sender: self)
}
@objc func btnClickMenu() {
print("MenuExt")
self.performSegue(withIdentifier: "q", sender: self)
}
@objc func btnClickBack() {
print("backExt")
}
@objc func btnclickDone(_ sender:UIButton){
}
}
我正在以编程方式创建导航栏。第一次加载屏幕时,标题视图中添加的标题按钮正常工作。当执行推入或演示然后关闭或弹出操作时,回到上一屏幕,这些按钮不起作用。但是左右导航按钮均正常工作。