2014-10-02 16 views
10

Ho un elemento dell'interfaccia utente (UISwitch in realtà, ma non importa davvero) che ha sia lo spazio iniziale che quello finale aggiunti a superview in Interface Builder. Il vincolo si presenta così in Xcode 6:iOS8 Auto layout programmaticamente pin al margine di layout relativo

Constraint pin

Il vincolo per aver guidato lo spazio è lo stesso in modo efficace. Il valore del vincolo è 42.0 punti.

Questo è esattamente quello che voglio, perché per i vari dispositivi posso cambiare layoutMargins proprietà su UIView ei vincoli funziona correttamente, per aumentare il margine tra i punti di vista.

Ora voglio aggiungere un'altra vista nel codice che avrebbe anche lo spazio iniziale e finale fissato al suo margine di superview, quindi lo stesso layoutMargins impostato su superview funzionerà.

ho appuntato la vista utilizzando lingua formato visivo con la seguente sintassi:

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-42.0-[separatorView]-42.0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(self.contentView, separatorView)]; 

[self.contentView addConstraints:constraints]; 
[self.contentView setNeedsUpdateConstraints]; 

questo funziona, ma layoutMargins proprietà non ha alcun effetto di utilizzare questo vincolo, per cui è, ovviamente, non appuntato a margine, ma direttamente per superview.

Quindi la mia domanda è:

Come al pin spazi elemento dell'interfaccia utente a margine nel codice usando il linguaggio formato visivo? O se non possibile, come eseguire il pin con l'API constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:?

Grazie!

risposta

14

In iOS8, il linguaggio del formato visivo è stato aggiornato in modo che "| -" o "- |" per impostazione predefinita utilizzerà una spaziatura definita dalla proprietà layoutMargins della superview.

Quindi la risposta utilizzando il linguaggio formato visivo è la seguente:

// programmatically set the layoutMargins, only if 
// you want non-default values and they are not already set in IB! 
self.contentView.layoutMargins = UIEdgeInsetsMake(0,42,0,42); // set left and right margins to 42 

// assume: seperatorView is already a subview of self.contentView 

// separatorView will use the constraints because we write "-" between it and the superview edge 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[separatorView]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(separatorView)]; 
[self.contentView addConstraints:constraints]; 

Se si vuole fare riferimento ai margini del layout durante la creazione dei vincoli tramite l'API diretta, quindi si utilizza il nuovo iOS 8 attributi di sola di layout:

NSMutableArray * constraints = [NSMutableArray array]; 
[constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
    attribute:NSLayoutAttributeLeftMargin 
    relatedBy:NSLayoutRelationEqual 
    toItem:separatorView 
    attribute:NSLayoutAttributeLeft 
    multiplier:1.0 
    constant:0]]; 
[constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
    attribute:NSLayoutAttributeRightMargin 
    relatedBy:NSLayoutRelationEqual 
    toItem:separatorView 
    attribute:NSLayoutAttributeRight 
    multiplier:1.0 
    constant:0]]; 
[self.contentView addConstraints:constraints]; 
4

sono d'accordo: "In iOS 8, il linguaggio formato visivo è stato aggiornato in modo che '| -' o '- |'. si imposterà a una distanza tra definita dalla proprietà layoutMargins del superview"

Quindi, è necessario selezionare l'opzione "Vincola al margine" quando si utilizza il Generatore di interfacce per assistere il layout. Se è così, allora funziona.

Se il problema non è stato ancora risolto, potresti darmi un progetto dimostrativo?

Aggiunto: T his article che ci mostra la funzione della nuova API ios8 preservaSuperviewLayoutMargins, desidero che sia più utile.

Problemi correlati