Подтвердить что ты не робот

Скрытие UIView с использованием ограничений AutoLayout

Время от времени у меня есть подзаголовок, который я хотел бы удалить из макета. Он не только должен быть скрыт, но и не должен считаться частью представления "поток", так сказать. Пример:

enter image description here

Я ищу стратегию, чтобы скрыть оранжевый вид программно. Расположение ящиков и их содержимое осуществляется через автозапуск. Следует отметить две вещи:

  • оранжевая рамка определяет ее вертикальную высоту, основанную на содержании, а также некоторые верхние/нижние смещения для полей. Таким образом, установка текста меток на nil будет только "сжимать" представление до его внутренних полей, он не будет иметь высоту 0.
  • Аналогичным образом, вертикальное расстояние между тремя полями означает, что даже если высота оранжевого ящика равна 0, промежуток между красным и желтым будет в два раза больше, чем требуется.

Возможное решение

Мое лучшее предложение - добавить ограничение в оранжевый ящик, установив его высоту в 0. Для этого мне нужно использовать неосуществленные приоритеты для всех вертикальных ограничений внутри оранжевого поля. В то же время контейнер должен обновлять константу для ограничения, которое разделяет поля. Мне не нравится такой подход, так как класс оранжевого ящика определяет его внутренние ограничения с учетом поведения супервизора. Возможно, я мог бы жить с ним, если вместо оранжевого окна будет представлен метод "свернуть", который добавит ограничение на высоту 0.

Есть ли лучший подход?

4b9b3361

Ответ 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.