2013-04-09 2 views
15

Я пытаюсь использовать 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]; 
} 

Может ли кто-нибудь сказать мне, куда должен идти этот код? Разумеется, я создаю дублирующие ограничения каждый раз, когда происходит макет.

Благодаря

ответ

31

Вам нужно будет обновить ограничения, как:

-(void)updateConstraints{ 
// add your constraints if not already there 
[super updateConstraints]; 
} 

После добавления ваших мнений SuperView вам нужно вызвать [self setNeedsUpdateConstraints], чтобы начать использовать их. Таким образом, время выполнения рендеринга вызовет updateConstraints в нужное время.

+1

Документация (https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/instm/UIView/updateConstraints) говорит: «Позвонить [super updateConstraints] как последний шаг в вашей реализации. ". – cnotethegr8

+26

Но это снова добавляет те же ограничения при каждом вызове updateConstraints? Рекомендуется ли сначала удалить любые ограничения, которые вы ранее добавили, прежде чем добавлять их снова? Или iOS достаточно мудр, чтобы признать, что ограничение, которое вы добавляете, уже существует и поэтому не добавляет его снова? – PapillonUK

+0

Я предполагаю, что не нужно называть setNeedsUpdateConstraints только при необходимости ... – Adrian

 Смежные вопросы

  • Нет связанных вопросов^_^