onde criar restrições de autolayout para uitableviewcell com subclasses?
Eu estou tentando usar autolayout para uma subclasse de uitableviewcell que estou criando e gostaria de receber alguns conselhos sobre qual método colocar o código de criação de restrição de layout. Eu tenho procurado e toda a informação que encontro fala sobre adicionar restrições depois de adicionar subviews no método viewDidLoad. Tanto quanto eu sei viewDidLoad não é uma opção para uma subclasse uitableviewcell.
Estou usando o construtor de interface para criar uma célula personalizada e alocá-la dinamicamente no meu código. Nada de especial ... Subclasse o uitableviewcell para poder adicionar uma uiview personalizada à célula. Mais uma vez, nada, particularmente, a Terra se despedaçando ... Minha dificuldade surge quando tento posicionar meu uiview personalizado em relação a um rótulo que adicionei à célula no construtor de interfaces.
Este é o código para criar o uiview personalizado e adicioná-lo à visualização de conteúdo da célula:
- (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];
}
Se eu colocar o código de restrição no final do initSelf nada acontece. A posição do meu _customBadge permanece em seu padrão. Quando coloco o código de restrição no layoutSubviews o posicionamento é aplicado; mas tenho certeza que é o lugar errado. Aqui está o código:
- (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];
}
Alguém pode me dizer onde esse código deve ir? Certamente, estou criando restrições duplicadas toda vez que um layout acontece.
obrigado