2013-04-09 12 views
15

Sto provando a utilizzare l'autolayout per una sottoclasse uitableviewcell che sto creando e gradirei qualche consiglio su quale metodo inserire il codice di creazione del vincolo di layout. Ho cercato in giro e tutte le informazioni che trovo parlano di aggiunta di vincoli dopo l'aggiunta di sottoview nel metodo viewDidLoad. Per quanto ne so, viewDidLoad non è un'opzione per una sottoclasse uitableviewcell.dove creare i vincoli di autolayout per la sottoclasse uitableviewcell?

Sto utilizzando il generatore di interfacce per creare una cella personalizzata e allocarla dinamicamente nel mio codice. Niente di speciale lì ... I sottoclasse uitableviewcell in modo da poter aggiungere uniview personalizzato alla cella. Di nuovo, niente di particolarmente sconvolgente la Terra ... La mia difficoltà arriva quando provo a posizionare il mio uiview personalizzato rispetto a un'etichetta che ho aggiunto alla cella nel generatore di interfacce.

Questo è il codice per creare l'UIView personalizzato e aggiungerlo alla visualizzazione del contenuto della cella:

- (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 metto il codice vincolo alla fine del INITSELF non succede nulla. La posizione del mio _customBadge rimane al suo valore predefinito. Quando inserisco il codice del vincolo in layoutSubview il posizionamento viene applicato; ma sono abbastanza sicuro che sia il posto sbagliato. Ecco il codice:

- (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]; 
} 

Qualcuno può dirmi dove questo codice dovrebbe andare? Sicuramente sto creando vincoli duplicati ogni volta che accade un layout.

Grazie

risposta

31

si avrebbe bisogno di aggiornare i vincoli come:

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

Dopo aver aggiunto le vostre opinioni al Superview è necessario chiamare [self setNeedsUpdateConstraints] per iniziare a utilizzarle. In questo modo il runtime di rendering chiamerà updateConstraints al momento giusto.

+1

La documentazione (https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/instm/UIView/updateConstraints) dice "Chiama [super updateConstraints] come passaggio finale dell'implementazione. ". – cnotethegr8

+26

Ma questo aggiunge nuovamente gli stessi vincoli ogni volta che viene chiamato updateConstraints? È consigliabile rimuovere prima eventuali restrizioni precedentemente aggiunte prima di aggiungerle di nuovo? O iOS è abbastanza saggio da riconoscere che un vincolo che stai aggiungendo esiste già e quindi non lo aggiunge di nuovo? – PapillonUK

+0

Immagino che non si debba chiamare setNeedsUpdateConstraints solo se necessario ... – Adrian