Swift - программно обновить ограничения sh - PullRequest
2 голосов
/ 04 марта 2020

Мой V C начинается с stackView, к которому добавлено Align Bottom to Safe Area.

У меня есть tabBar, но в начале скрыто tabBar.isHidden = true.

Позже, когда появляется tabBar , он скрывает stackView

Так что мне нужна функция, которая refre sh ограничения после tabBar.isHidden = false


Когда я запускаю приложение с tabBar.isHidden = false, stackView отображается правильно.


Пробовал с каждой функцией вроде: stackView.needsUpdateConstraints() , updateConstraints() , setNeedsUpdateConstraints() безуспешно.


Теперь я программно меняю нижнюю часть, но когда я переключаю tabBarIndex и возвращаюсь к той, у которой изменились нижние ограничения, он обнаруживает tabBar и поднимает stackView под другим видом (который не присоединен к ограничения). Like снова обновляет ограничения. Я скрываю и показываю этот stackView с ограничениями включения / выключения экрана.

Мне нужно обновить ограничения sh после tabBar.isHidden = false, но ограничения не определяют внешний вид tabBar.

Как я уже упоминал, переключение между tabBars устраняет проблему, поэтому некоторый код выполняется для обнаружения tabBar после переключения. Кто-нибудь знает этот код? Я безуспешно пытался вызвать методы viewDidLayoutSubviews и viewWillLayoutSubviews ... Есть предложения?

Ответы [ 4 ]

1 голос
/ 31 марта 2020
    tabBarController!.selectedIndex = 1
    tabBarController!.selectedIndex = 0

Этот любительский подход исправил мою ошибку ...: D

0 голосов
/ 05 марта 2020

после обновления ограничений stackView вызывают этот метод:

stackView.superview?.layoutIfNeeded()
0 голосов
/ 06 марта 2020

Apple Human Interface Guidelines указывает, что не следует возиться с панелью вкладок, поэтому (я предполагаю) настройка tabBar.isHidden не обновляет должным образом остальную часть иерархии представления.

Быстрый поиск предлагает различные UITabBarController расширения для отображения / скрытия панели вкладок ... но все они выглядят как pu sh tabBar внизу экрана, а не устанавливают его свойство .isHidden. Может или не может быть подходящим для вашего использования.

Я предполагаю из ваших комментариев, что ваш V C в индексе табуляции 0 имеет кнопку (или какое-либо другое действие), чтобы показать / скрыть tabBar?

Если это так, вот подход, который может выполнить работу ....

Добавить это enum в ваш проект:

enum TabBarState {
    case toggle, show, hide
}

и поместите это забавное c в этот контроллер вида:

func showOrHideTabBar(state: TabBarState? = .toggle) {

    if let tbc = self.tabBarController {
        let b: Bool = (state == .toggle) ? !tbc.tabBar.isHidden : state == .hide
        guard b != tbc.tabBar.isHidden else {
            return
        }
        tbc.tabBar.isHidden = b
        view.frame.size.height -= 0.1
        view.setNeedsLayout()
        view.frame.size.height += 0.1
    }
}

Вы можете вызвать его с помощью:

// default: toggles isHidden
showOrHideTabBar()

// toggles isHidden
showOrHideTabBar(state: .toggle)

// SHOW tabBar (if it's hidden)
showOrHideTabBar(state: .show)

// HIDE tabBar (if it's showing)
showOrHideTabBar(state: .hide)

Я бы ожидал , что простое сопряжение .setNeedsLayout() с .layoutIfNeeded() после установки свойства tabBar .isHidden должно работать, но, очевидно, нет.

Быстрое изменение высоты кадра (в сочетании с .setNeedsLayout()) вызывает автоматическое расположение, хотя изменение высоты не видно.

ПРИМЕЧАНИЕ : Это результат очень краткого тестирования на одном устройстве и одной версии iOS. Я ожидаю, что он будет работать на разных устройствах и версиях, но я еще не закончил полное тестирование.

0 голосов
/ 04 марта 2020

Если вы хотите обновить макет представления, вы можете попробовать функцию layoutIfNeeded () .

...