Где создавать ограничения автоопределения для подкласса uitableviewcell?
Я пытаюсь использовать autolayout для подкласса uitableviewcell, который я создаю, и я был бы признателен за некоторые советы о том, какой метод поставить код создания ограничения макета. Я искал вокруг, и вся информация, которую я нахожу, говорит о добавлении ограничений после добавления subview в методе viewDidLoad. Насколько я знаю, viewDidLoad не является вариантом для подкласса 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];
}
Может ли кто-нибудь сказать мне, куда должен идти этот код? Конечно, я создаю дублирующие ограничения каждый раз, когда происходит макет.
Спасибо
Ответы
Ответ 1
Вам нужно будет обновить ограничения, например:
-(void)updateConstraints{
// add your constraints if not already there
[super updateConstraints];
}
После добавления ваших просмотров в супервизор вам нужно позвонить [self setNeedsUpdateConstraints]
, чтобы начать их использовать. Таким образом, время выполнения рендеринга вызовет updateConstraints
в нужное время.