При удалении подвью все ограничения, связанные с этим подвью будут потеряны. Если вам нужно снова добавить 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
, обозначенного |
. Это довольно круто.
Спасибо. Это хорошо и понятно. Одна заметка о том, что я спросил о какао, а не о какао-касании, но для других следует отметить, что API-интерфейсы (как описано Питером Аммоном из Apple) одинаковы или почти одинаковы. Подходы в обоих мирах должны быть одинаковыми. – uchuugaka
да, простите, я пропустил это. Хорошая точка –
[Документация] (https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/updateConstraints) говорит, что это ** important ** для вызова '[super updateConstraints]' в качестве последнего шага в вашей реализации. Он должен идти в конце вашего метода, а не в начале. – Eric