Удаление и повторное добавление подпредставления с помощью autolayout

При использовании autolayout я понимаю, что при удалении подпредставления (при сохранении ссылки на него, конечно), удаленное подпредставление все еще знает свои ограничения автопоставки.

Однако при добавлении его обратно в суперпредставление подпредставление больше не знает его размер кадра. Скорее, это похоже на нулевой кадр.

Я предполагал, что autolayout автоматически изменит его размер в соответствии с ограничениями. Разве это не так? Я думал, что автоматическое расположение означало неНе связывайтесь с фреймами. Мне все еще нужно установить начальный кадр прямоугольным при добавлении подпредставления, даже с автоматическим макетом?

Ответы на вопрос(1)

Решение Вопроса

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

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

-(void)updateConstraints
{
    if (!_myLayoutConstraints)
    {
        NSMutableArray *constraints = [NSMutableArray array];

       // Create all your constraints here
       [constraints addWhateverConstraints];

       // Save the constraints in an ivar. So that if updateConstraints is called again,
       // we don't try to add them again. That would cause an exception.
       _myLayoutConstraints = [NSArray arrayWithArray:constraints];

       // Add the constraints to myself, the custom subview
       [self addConstraints:_myLayoutConstraints]; 
   }

   [super updateConstraints];
}

updateConstraints будет вызываться автоматически средой выполнения Autolayout. Код выше идет в ваш пользовательский подкласс.UIView

Вы'Правильно, что работая с Autolayout, вы неЯ не хочу касаться размеров кадра. Вместо этого просто обновите ограничения вupdateConstraints, Или, что еще лучше, установите ограничения, чтобы вы недолжен.

Смотрите мой ответ на эту тему:

Autolayout UIImageView с программным изменением размера без соблюдения ограничений

Ты неТ нужно установить начальный кадр. Если вы используетеinitWithFrameпросто установите егоCGRectZero, Ваши ограничения будут - на самом деледолжен - подробно опишите, насколько большим должно быть что-либо, или другие отношения, которые означают, что среда выполнения может определить размер.

Например, если ваш визуальный формат:@"|-[myView]-|", тот'Все, что вам нужно для горизонтального измерения. Autolayout будет знать размерmyView быть до предела родителяsuperview обозначено|, Это'довольно круто

 Max MacLeod05 дек. 2013 г., 14:57
да, я думаю, что был представлен с iOS7. Сейчас обновил спасибо
 Max MacLeod26 июн. 2013 г., 15:01
да, извините, я пропустил это. Хорошая точка зрения
 uchuugaka07 мар. 2014 г., 06:52
Должно быть, я был сонный. Действительно initWithFrame может получить его и нормально работать.
 uchuugaka26 июн. 2013 г., 14:16
Благодарю. Тот'хорошо и ясно. Одно замечание, которое я спросил о Какао, а не о Какао-прикосновении, но другие заметили, что API (как описано Питером Аммоном из Apple) одинаковы или почти одинаковы. Подходы в обоих мирах должны быть одинаковыми.
 Max MacLeod07 янв. 2014 г., 15:34
вы имеете в виду CGRectZero? Я могу'Не комментируйте NSView, но я думаю, что он работает так же. Используя Auto Layout, вы должны работать с ограничениями, а не с фреймами. Вызов [[UIView alloc] init] создаст представление CGRectZero так же, как initWithFrame: CGRectZero.
 Eric05 дек. 2013 г., 14:49
Документация говорит, что этоважный звонить[super updateConstraints] как последний шаг в вашей реализации. Это должно идти в конце вашего метода, а не в начале.
 uchuugaka07 янв. 2014 г., 14:45
К сожалению я нене вижу, как NSView обрабатывает CGZeroRect или NSZeroRect так же хорошо, как UIView ... пожалуйста, скажите мне, что я воображаю это. (обратите внимание на теги)
 trevorKirkby04 июн. 2018 г., 21:11
Возможно ли что-то подобное в Swift?

Ваш ответ на вопрос