2014-10-02 13 views
10

Mam element interfejsu użytkownika (UISwitch w rzeczywistości, ale nie ma to znaczenia), który ma przyporządkowaną spację wiodącą i końcową do podglądu w Kreatorze interfejsów. Ograniczenie wygląda to w Xcode 6:Układ automatyczny iOS8 programowo przypięty do względnego marginesu układu.

Constraint pin

ograniczenie dla wiodących miejsca to samo skutecznie. Wartość ograniczenia wynosi 42.0 punktów.

To jest dokładnie to, co chcę, bo dla różnych urządzeń mogę zmienić layoutMargins nieruchomości na UIView i ograniczenia będzie działać prawidłowo, aby zwiększyć margines pomiędzy widokami.

Teraz chcę dodać kolejny widok w kodzie, który również będzie miał przyporządkowany i kończący spację do jego marginesu podglądu, więc ten sam layoutMargins ustawiony na super podgląd zadziała.

I przypięte pogląd korzystając wizualny Format Język z następującą składnią:

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

To działa, ale layoutMargins nieruchomość nie ma wpływu za pomocą tego ograniczenia, więc to nie jest oczywiście przypięty do marginesu, ale bezpośrednio do podglądu.

Więc moje pytanie brzmi:

Jak przypiąć UI przestrzenie elementem marży w kodzie za pomocą języka formatowania wizualnego? Lub jeśli nie jest to możliwe, jak przypiąć z interfejsem API constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:?

Dzięki!

Odpowiedz

14

W iOS8 język w formacie wizualnym został zaktualizowany, aby "| -" lub "- |" będzie domyślnie używał odstępu zdefiniowanego przez właściwość layoutMargins w superview.

Więc odpowiedź za pomocą języka formatowania wizualnego jest następujący:

// 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]; 

Jeśli chcesz zapoznać się z marginesów układ przy tworzeniu ograniczeń poprzez bezpośrednią API, a następnie użyć nowego systemów iOS 8 tylko atrybuty układ:

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

zgadzam „W systemów iOS 8, wizualny język Format został zaktualizowany tak, że«| -»lub«- |». będzie domyślnie przy odległości między zdefiniowany przez własność layoutMargins w Superview za”

Powinieneś zaznaczyć opcję "Ogranicza do marginesu", gdy korzystasz z Kreatora interfejsu do wspomagania układu. Jeśli tak, to działa.

Jeśli problem nadal nie został rozwiązany, czy możesz dać mi projekt demonstracyjny?

Dodano: T his article whcih pokaż nam funkcję nowych API ios8 preservesSuperviewLayoutMargins, życzę bardziej przydatnych.

Powiązane problemy