Я пытаюсь использовать autolayout для подкласса uitableviewcell, который я создаю, и я был бы признателен за некоторые советы о том, какой метод поместить код создания ограничения компоновки. Я искал вокруг, и вся информация, которую я нахожу, говорит о добавлении ограничений после добавления subview в методе viewDidLoad. Насколько я знаю, viewDidLoad не является вариантом для подкласса uitableviewcell.где создавать ограничения автоопределения для подкласса uitableviewcell?
Я использую конструктор интерфейса для создания пользовательской ячейки и динамического выделения ее в моем коде. Ничего особенного ... Я подклассифицировал uitableviewcell, чтобы добавить пользовательский uiview в ячейку. Опять же, ничего особенно не разрушило Землю ... Моя трудность возникает, когда я пытаюсь позиционировать свой пользовательский uiview в отношении метки, которую я добавил в ячейку в построителе интерфейса.
Это код для создания пользовательского UIView и добавить его представления содержимого ячейки:
- (id)initWithCoder:(NSCoder *)decoder
{
if ((self = [super initWithCoder:decoder]))
{
[self initSelf];
}
return self;
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]))
{
[self initSelf];
}
return self;
}
- (void) initSelf
{
// Initialization code
_badgeLabel = @"";
if (!_customBadge)
{
_customBadge = [CustomBadge customBadgeWithString:self.badgeLabel];
}
// hide the badge until needed
self.customBadge.hidden = YES;
// add badge to the cell view hierarchy
[self.customBadge setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.customBadge setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal];
[self.customBadge setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical];
[self.contentView addSubview:self.customBadge];
}
Если я ставлю код ограничения в конце initSelf ничего не происходит. Позиция моего _customBadge остается на уровне «по умолчанию». Когда я помещаю код ограничения в layoutSubviews, применяется позиционирование; но я уверен, что это неправильное место. Вот код:
- (void) layoutSubviews
{
[self.contentView addConstraint:[NSLayoutConstraint
constraintWithItem:self.customBadge
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.competence
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:-14.0]];
[self.contentView addConstraint:[NSLayoutConstraint
constraintWithItem:self.customBadge
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.competence
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0.0]];
[super layoutSubviews];
}
Может ли кто-нибудь сказать мне, куда должен идти этот код? Разумеется, я создаю дублирующие ограничения каждый раз, когда происходит макет.
Благодаря
Документация (https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/instm/UIView/updateConstraints) говорит: «Позвонить [super updateConstraints] как последний шаг в вашей реализации. ". – cnotethegr8
Но это снова добавляет те же ограничения при каждом вызове updateConstraints? Рекомендуется ли сначала удалить любые ограничения, которые вы ранее добавили, прежде чем добавлять их снова? Или iOS достаточно мудр, чтобы признать, что ограничение, которое вы добавляете, уже существует и поэтому не добавляет его снова? – PapillonUK
Я предполагаю, что не нужно называть setNeedsUpdateConstraints только при необходимости ... – Adrian