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
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
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
Immagino che non si debba chiamare setNeedsUpdateConstraints solo se necessario ... – Adrian