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

У меня есть супервизор с видом круга и вид держателя, который содержит 3 метки в качестве подвида и центрирован по супервиду, как показано на изображении   введите здесь описание изображения

Я добавил ограничения для 3 меток в отношении держателя, а также добавил ограничения для держателя в отношении супервизора.

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(titleLabel);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[titleLabel]-|"
                                        options:0
                                        metrics:nil
                                          views:viewsDictionary];

[holderView addConstraints:constraints];


viewsDictionary = NSDictionaryOfVariableBindings(setLabel);
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[setLabel]-|"
                                        options: 0
                                        metrics:nil
                                          views:viewsDictionary];

[holderView addConstraints:constraints];


viewsDictionary = NSDictionaryOfVariableBindings(repLabel);
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[repLabel]-|"
                                        options:0
                                        metrics:nil
                                          views:viewsDictionary];

[holderView addConstraints:constraints];

viewsDictionary = NSDictionaryOfVariableBindings(titleLabel, setLabel, repLabel);
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[titleLabel]-0-[setLabel]-0-[repLabel]-|"
                                        options:0
                                        metrics:nil
                                          views:viewsDictionary];

[holderView addConstraints:constraints];


NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_labelView);
    NSArray *constraints =[NSLayoutConstraint constraintsWithVisualFormat:@"|-[_labelView]-|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:viewsDictionary];
    [self addConstraints:constraints];

В приложении есть функция сужения круга. Я хочу, чтобы держатель и его подвиды динамически сокращались. Добавление ограничений работает для держателя, но подвиды смещаются.

введите здесь описание изображениявведите здесь описание изображения

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

Может ли кто-нибудь указать на ошибки и привести меня к правильному решению?


person Tarang    schedule 14.04.2014    source источник
comment
Вы должны показать код того, как вы справляетесь с усадкой. Если вы на самом деле изменяете рамку представления держателя, это неправильно — вы должны делать это с ограничениями. Какие ограничения у вас есть между представлением супервизора и представлением держателя?   -  person rdelmar    schedule 14.04.2014
comment
На самом деле вы правы, я также обновлял рамку вида держателя. Но ограничения должны позаботиться об этом. Теперь он работает так, как ожидалось. Спасибо   -  person Tarang    schedule 14.04.2014


Ответы (2)


Использование автоматической компоновки и изменение свойства фрейма все портит.

Создайте тест на ограничения, которые вы хотите изменить или анимировать.

__weak IBOutlet UIView *settingsView;
__weak IBOutlet NSLayoutConstraint *settingsBottomConstraint;
__weak IBOutlet NSLayoutConstraint *settingsViewHeightConstraint;

Обновите ограничения (никогда не рамку!)

settingsBottomConstraint.constant = - settingsViewHeightConstraint.constant;
[settingsView setNeedsUpdateConstraints];
[settingsView layoutIfNeeded];
isSettingsHidden = YES;

Недавно я работал с анимацией представлений с автомакетом, и вы можете найти свой ответ здесь Изменение ограничения Auto Layout не анимируется

person BangOperator    schedule 16.04.2014

Вы также можете использовать функцию updateConstraints.

[settingsView updateConstraints];
person Josh Wolff    schedule 02.08.2020