Ho creato una sottoclasse di UIView per creare un groupView personalizzato che uso per aggiungere alcune cose al mio layout in modo semplice. Questo groupView include un UILabel che viene usato come titolo e un UIView che disegna un roundRect sul suo CALayer con un colore di sfondo. Pensa alle sezioni di UITableView. Aggiungo questo groupView allo storyboard facendo cadere un UIView e cambiando la sua classe nella mia sottoclasse. Funziona tutto bene, ho impostato l'intestazione tramite gli attributi di runtime definiti dall'utente in Xcode. Tutto funziona alla grande, aggiungo UILabels a questa vista sullo storyboard e crea l'etichetta di titolo e roundrect quando viene eseguito.Autolayout a livello di programmazione su una sottoview di una UIView sottoclasse
struttura del mio GroupView:
- GroupView: (UIView) ClipToBounds: NO;
- intestazione: (UILabel) posizionato sopra il groupView.
- contentView: (UIView) crea il roundRect e il colore tramite CALayer, deve avere le stesse dimensioni del groupView.
Allora qual è il problema? Beh, trattare con l'autolayout è un problema, ma per far funzionare questa sottoclasse di UIView ho bisogno di impostare i vincoli contentView a livello di programmazione. Non riesco a capire la sintassi di questa stringa di formato ASCII di layout automatico. Attualmente ho:
_contentView = [[UIView alloc]initWithFrame:self.bounds];
_contentView.layer.cornerRadius = 5.0f;
_contentView.layer.masksToBounds=YES;
_contentView.backgroundColor=_backgroundColor;
_contentView.layer.borderWidth=_borderWidth;
_contentView.layer.borderColor=_borderColor.CGColor;
[self insertSubview:_contentView atIndex:0];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(self,_contentView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[self]-0-[_contentView]-0-[self]" options:0 metrics:nil views:viewsDictionary];
for (NSLayoutConstraint *constraint in constraints) {
[_contentView addConstraint:constraint];
}
che va in crash con: * di terminazione app a causa di eccezione non identificata 'NSGenericException', la ragione: 'Impossibile installare vincolo vista. Il vincolo fa riferimento a qualcosa al di fuori del sottostruttura della vista? Questo è illegale. vincolo: view:> '
ho provato questa prima e ancora non ha funzionato:
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_contentView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[_contentView]-0-|" options:0 metrics:nil views:viewsDictionary];
che va in crash con: * terminazione app a causa di eccezione non identificata 'NSGenericException', la ragione:' Impossibile installare il vincolo sulla vista. Il vincolo fa riferimento a qualcosa al di fuori del sottostruttura della vista? Questo è illegale. vincolo: view:>'
RANT: In qualche modo questo layout automatico è supponiamo di salvarci lavoro, ma io non vedo come i benefici fuori di peso l'overhead in questo momento. Perché sulla Terra si sono spostati dall'utilizzo di riferimenti e metodi o addirittura digitare defs a questa stringa di formato arcaico? Quanto sarebbe più semplice fare: [_contentView constraint: NSLayoutFormatAlignLeading toView: self withDistance: 0.0f]; O qualcosa di simile? Mi piacerebbe così tanto fare lo con molle e montanti a questo punto.
Qualsiasi aiuto nella comprensione o la dimostrazione della sintassi per limitare il contenuto alla dimensione di sé sarebbe utile.
Per quanto riguarda il tuo rant: l'Autolayout ha una curva di apprendimento e tu tendi a odiarlo all'inizio - ma una volta che pensi interamente ai vincoli invece che ai fotogrammi, diventa più facile. E il "formato visivo" è piuttosto inutile, a meno che non stiate mettendo le cose in fila. L'altro metodo (constraintWithItem ...) è fondamentalmente la sintassi che stai cercando nel tuo rant sopra. – jrturton
Se qualcun altro ha problemi a capire questa stringa in formato ASCII, ho trovato utile questo tutorial. So che è per Ruby ma la stringa di formato è la stessa di Objective-C. http://seanlilusus.github.com – brucemartin