Swift создать подкласс для прозрачной панели навигации - PullRequest
0 голосов
/ 26 августа 2018

Я сделал прозрачную панель навигации в нескольких viewcontroller с помощью приведенного ниже кода. Я хотел бы уменьшить количество строк кода в файлах основного класса, а также попытаться избежать дублирования кода. Итак, мне нужно создать подкласс для кода ниже. Пожалуйста, помогите мне

    // NavigationBar Tranparant
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.isTranslucent = true
    self.navigationController?.view.backgroundColor = .clear

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Создать расширение:

extension UIViewController {
    func setTransparentNavBar() {
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.isTranslucent = true
    }
}

Если вам нужна прозрачная панель навигации в UIViewController, просто вызовите setTransparentNavBar в viewDidLoad.

0 голосов
/ 26 августа 2018

Если вы создаете свои элементы с помощью раскадровок, просто создайте подкласс 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.

Поскольку последнее требуется, мы имеемтакже настройте нашу навигацию здесь ..

...