Программно изменить ограничение на макете разрывов UILabel - PullRequest
0 голосов
/ 25 июня 2019

У меня есть UILabel с двумя ограничениями. Одно из ограничений я активирую, а другое оставляю отключенным. У меня есть кнопка, которая отключает первое ограничение и активирует второе ограничение. Затем при повторном нажатии отключает второе ограничение и повторно активирует первое ограничение. Нажатие на эту кнопку в первый раз работает как задумано. UILabel, включая все другие UILabel, привязанные к нему, перемещается в другую позицию. Однако при нажатии на кнопку, чтобы переместить ее назад, раскладка ломается. UILabel перемещается в положение, почти такое же, как и раньше, но все другие UILabel, ограниченные им, остаются на месте и не возвращаются в исходное положение.

Вот функция, которая обрабатывает активацию ограничений.

- (void)tapOnce:(UIGestureRecognizer *)gesture
{
    if (_constraintLabelOne.isActive) {
        [_constraintLabelOne setActive:NO];
        [_constraintLabelTwo setActive:YES];
    } else {
        [_constraintLabelTwo setActive:NO];
        [_constraintLabelOne setActive:YES];
    }
    [self layoutIfNeeded];
}

Ограничения выглядят следующим образом.

_constraintLabelOne = [NSLayoutConstraint constraintWithItem:myLabel
                                                                   attribute:NSLayoutAttributeTop
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:topView
                                                                   attribute:NSLayoutAttributeBottom
                                                                  multiplier:1.0
                                                                    constant:6];
_constraintLabelTwo = [NSLayoutConstraint constraintWithItem:myLabel
                                                                   attribute:NSLayoutAttributeTop
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:topView
                                                                   attribute:NSLayoutAttributeBottom
                                                                  multiplier:1.0
                                                                    constant:20];

Другие метки, ограниченные myLabel, застряли во второй позиции после того, как tapOnce был вызван в первый раз. Почему они не возвращаются в исходное положение после того, как ограничения myLabel были обновлены?

Я прикрепил скриншот с рисунком текущего поведения. Синяя рамка обозначает topView. Пурпурный прямоугольник представляет myLabel. Первый экран перед вызовом tapOnce. Средний экран после вызова tapOnce один раз. Правый экран после вызова tapOnce дважды.

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Я понял это.То, что происходило, было то, что высота UILabel не была ограничена, поэтому, когда второе ограничение было деактивировано, а первое ограничение активировалось, высота автоматически увеличивалась (см. Изображение ниже).Чтобы это исправить, я должен был вручную ограничить высоту всех моих элементов просмотра.Если у кого-то есть лучшее решение, пожалуйста, опубликуйте его, так как я бы предпочел не устанавливать вручную высоту для каждого элемента, потому что это может привести к разрыву макетов на разных устройствах.

enter image description here

ОБНОВЛЕНИЕ

Спасибо siburb за указание свойства Content Hugging Priority для элементов пользовательского интерфейса.Корень моей проблемы заключался в том, что это свойство не было установлено, что позволило увеличить высоту моего UILabel.Решением было установить для этого свойства значение 750 или выше.

[myLabel setContentHuggingPriority:750 forAxis:UILayoutConstraintAxisVertical];
0 голосов
/ 25 июня 2019

Я бы сделал это, установив priority одного из ограничений ниже, чтобы оно было «необязательным», например, UILayoutPriorityDefaultHigh, или даже выше, например, 999.

.оба ограничения активны одновременно, и требуемое ограничение будет иметь приоритет.

Чтобы установить его, установите требуемое ограничение для состояния по умолчанию и необязательное ограничение для состояния нажатия кнопки.

Вы можете начать с обоих активных ограничений, а затем, когда кнопка нажата, вы просто отключите (установите constraint.active = NO) необходимое ограничение, а другое будет иметь приоритет.При повторном нажатии кнопки вы просто активируете необходимое ограничение.

...