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

questionAnswers(1)

yourAnswerToTheQuestion