Если вы создаете свои элементы с помощью раскадровок, просто создайте подкласс UINavigationBar
и добавьте свои свойства в функцию awakeFromNib
.
Теперь в ваших раскадровках выберите навигационную панель навигационного контроллера и задайте еекласс (из инспектора идентификации), который вы только что создали.
Пример для вашего подкласса UINavigationBar:
import UIKit
class AppBaseNavigationBar : UINavigationBar{
override func awakeFromNib() {
super.awakeFromNib()
self.setBackgroundImage(UIImage(), for: .default)
self.shadowImage = UIImage()
self.titleTextAttributes = [
NSAttributedStringKey.foregroundColor : UIColor.black
]
self.isTranslucent = true
}
}
Однако, если вы хотите использовать его по коду, т.е. (let nav = UINavigationController(navigationBarClass: AppBaseNavigationBar.self, toolbarClass : nil)
)
вам нужно добавить override init(frame: CGRect)
и required init?(coder: NSCoder
(требуется последнее), так как мы не из Nib и awakeFromNib
не будет вызван.
Таким образом, ваш подкласс будет выглядеть следующим образом:
import UIKit
class AppBaseNavigationBar : UINavigationBar{
override init(frame: CGRect) {//for using custom view in code
super.init(frame: frame)
setupNavBar()
}
required init?(coder aDecoder: NSCoder) {// for using CustomView in IB
super.init(coder: aDecoder)
setupNavBar()
}
override func awakeFromNib() {
super.awakeFromNib()
setupNavBar()
}
func setupNavBar(){
// To avoid duplicate code, move your properties to a function.
self.setBackgroundImage(UIImage(), for: .default)
self.shadowImage = UIImage()
self.titleTextAttributes = [
NSAttributedStringKey.foregroundColor : UIColor.black
]
self.isTranslucent = true
}
}
override init(frame: CGRect)
используется при программном создании представления.(Вот почему мы реализовали это, поскольку мы собираемся создать наш NavigationController программным способом)
required init?(coder: NSCoder)
используется, когда представление создается из раскадровки / xib.
Поскольку последнее требуется, мы имеемтакже настройте нашу навигацию здесь ..