Скрытие UIView с использованием ограничений AutoLayout
Время от времени у меня есть подзаголовок, который я хотел бы удалить из макета. Он не только должен быть скрыт, но и не должен считаться частью представления "поток", так сказать. Пример:
![enter image description here]()
Я ищу стратегию, чтобы скрыть оранжевый вид программно. Расположение ящиков и их содержимое осуществляется через автозапуск. Следует отметить две вещи:
- оранжевая рамка определяет ее вертикальную высоту, основанную на содержании, а также некоторые верхние/нижние смещения для полей. Таким образом, установка текста меток на nil будет только "сжимать" представление до его внутренних полей, он не будет иметь высоту 0.
- Аналогичным образом, вертикальное расстояние между тремя полями означает, что даже если высота оранжевого ящика равна 0, промежуток между красным и желтым будет в два раза больше, чем требуется.
Возможное решение
Мое лучшее предложение - добавить ограничение в оранжевый ящик, установив его высоту в 0. Для этого мне нужно использовать неосуществленные приоритеты для всех вертикальных ограничений внутри оранжевого поля. В то же время контейнер должен обновлять константу для ограничения, которое разделяет поля. Мне не нравится такой подход, так как класс оранжевого ящика определяет его внутренние ограничения с учетом поведения супервизора. Возможно, я мог бы жить с ним, если вместо оранжевого окна будет представлен метод "свернуть", который добавит ограничение на высоту 0.
Есть ли лучший подход?
Ответы
Ответ 1
Вы можете сделать это, добавив дополнительное ограничение между желтым и красным изображениями с более низким приоритетом и настройкой приоритетов в коде.
![enter image description here]()
Короткое прерывистое ограничение (orangeToRedCon - это выход) имеет приоритет 999 (вы не можете изменить требуемый приоритет на необязательный, так что почему он не 1000). Длинное прерывистое ограничение (yellowToRedCon) имеет приоритет 500 и константу 20. В коде вы можете скрыть оранжевый вид и заменить эти уровни приоритета, и это приведет к тому, что желтый вид будет перемещаться до любого значения, которое вы имеете set для постоянного значения yellowToRedCon.
-(void)changePriorities {
self.yellowToRedCon.priority = 999;
self.orangeToRedCon.priority = 500;
[UIView animateWithDuration:.5 animations:^{
self.orangeView.alpha = 0;
[self.view layoutIfNeeded];
}];
}
Этот метод не требует каких-либо изменений в высоте оранжевого вида.
Ответ 2
В iOS 9 вы можете использовать UIStackView
.
Существуют также полиполки для более старых версий: TZStackView и OAStackView
Ответ 3
Что вы можете сделать, это ограничение высоты оранжевого вида в качестве выхода (чтобы иметь доступ к нему).
затем анимируйте коллапс следующим образом:
[UIView animateWithDuration:0.3 animations:^{
orangeHeightConstraint.constant = 0;
[self.view layoutIfNeeded]
}];
Оранжевый вид должен иметь верхнее ограничение для красного представления и нижнее ограничение для желтого вида.
Также не забудьте проверить программные возможности Clip Subviews в IB или [orangeView clipsToBounds]
Ответ 4
Я решил бы это, включив все "необходимые" пространства подвью в качестве части самого поднабора. Сюда,
1. Красный вид Высота = видимая красная часть + нижнее пространство
2. Оранжевый вид Высота = видимая оранжевая часть + нижнее пространство
3. Желтый вид Высота = видимое желтое + нижнее пространство
Когда вы установите для параметра "Оранжевый вид высоты" значение "0" автозагрузкой, оно автоматически уменьшит и нижнее пространство на 0.