Как скрыть тень навигационной панели только в подробном представлении?

В 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()
            }
        }
    }

Любая помощь в этом очень ценится.

Изображение моей раскадровки

1 ответ

Решение

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

Вы можете использовать эту настройку. Сказать 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()
    }
}

Настройка раскадровки

Выход

Примечание. Еще один аккуратный подход - хранение тени внутри 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
}

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

Другие вопросы по тегам