Как скрыть тень панели навигации только в подробном представлении? - PullRequest
0 голосов
/ 18 ноября 2018

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

Чтобы протестировать этот конкретный случай, я создал новый проект, используя шаблон приложения master-detail.В DetailViewController -> viewDidAppear я кодировал следующее:

    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()

Приведенный выше код работает для приложения Single View и на симуляторе iPad Air 2.Однако он не работает на detailViewController приложения master-detail в симуляторе iPhoneX.

В качестве альтернативы я также попытался получить подпредставления навигационной панели в viewDidAppear и попытался скрыть тень (см. Код ниже).Тем не менее, количество подпредставлений равно нулю.Как это может быть?

    for parent in self.navigationController!.navigationBar.subviews {
        for childView in parent.subviews {
            if(childView is UIImageView) {
                childView.removeFromSuperview()
            }
        }
    }

Любая помощь по этому вопросу высоко ценится.

Image of my storyboard

1 Ответ

0 голосов
/ 18 ноября 2018

Для общего потока

Вы можете использовать эту настройку.Скажем, ViewController - это все остальные классы контроллера вида (где вам нужна тень), а DetailViewController - это класс контроллера подробного вида.

То, что я делаю, сохраняя теневое изображение.

ViewController.swift

class ViewController: UIViewController {

    var shadowImage: UIImage!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

         shadowImage = self.navigationController?.navigationBar.shadowImage
    }


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.navigationController?.navigationBar.shadowImage = shadowImage
    }

}

И DetailViewController.swift

class DetailViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.navigationController?.navigationBar.shadowImage = UIImage()
    }
}

Настройка раскадровки enter image description here

Выход

enter image description here

Примечание: Другойаккуратный подход будет хранить тень в DetailsViewController и устанавливать ее, когда вид исчезает

class DetailsViewController: UIViewController {

    var shadowImage: UIImage!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        shadowImage = self.navigationController?.navigationBar.shadowImage
        self.navigationController?.navigationBar.shadowImage = UIImage()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.navigationController?.navigationBar.shadowImage = shadowImage
    }
}

Это решение более элегантно и приводит к чистому управлению.

ДляMasterDetailFlow, используя SplitViewController

в вашем MasterViewControlelr.swift

override func viewWillAppear(_ animated: Bool) {
    clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed // placeholder code when you created the project
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.shadowImage = nil
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.navigationBar.shadowImage = UIImage()
}

в вашем DetailViewController.swift

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.shadowImage = UIImage()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.navigationBar.shadowImage = nil
}

Выход (основной / подробный поток)

enter image description here

...