Где создавать ограничения автоопределения для подкласса 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 в нужное время.