2013-06-21 3 views
9

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

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

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

ответ

16

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

Как правило, я создаю ограничения в своем пользовательском подзаголовке. Например:

-(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 with programatic re-size not following constraints

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

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

+1

Спасибо. Это хорошо и понятно. Одна заметка о том, что я спросил о какао, а не о какао-касании, но для других следует отметить, что API-интерфейсы (как описано Питером Аммоном из Apple) одинаковы или почти одинаковы. Подходы в обоих мирах должны быть одинаковыми. – uchuugaka

+1

да, простите, я пропустил это. Хорошая точка –

+1

[Документация] (https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/updateConstraints) говорит, что это ** important ** для вызова '[super updateConstraints]' в качестве последнего шага в вашей реализации. Он должен идти в конце вашего метода, а не в начале. – Eric