2013-08-12 9 views
10

Próbuję ustawić górne i dolne wyściółki w widoku Autolayout przy użyciu języka w formacie wizualnym. Kod kompiluje się i działa, jeśli piszę paddings jako liczby całkowite w łańcuchu formatu wizualnego, ale zawodzi, gdy próbuję go zastąpić stałą. Tutaj jest błąd Dostaję:Jak używać stałej NSNumber lub CGFloat w języku Autolayout?

Zakończenie aplikację spowodowane nieprzechwyconego wyjątkiem „NSInvalidArgumentException”, powód: „Nie można przeanalizować ograniczenie formatu : To nie jest możliwe, aby ustawić przestrzeń równą szerokości lub wysokości z widok. Być może chcesz użyć widoku jako elementu dystansowego? [widok1] [spacer (== widok1)] [widok2] V: | -kTopAndBottomPadding- [messageTextView] -kTopAndBottomPadding- |

A to jest mój kod.

CGFloat const SPMTVC_kTopAndBottomPadding = 5.0; 
// ... 

// Create my own NSDictionary of variable bindings. 
NSDictionary *variableBindings = @{@"messageTextView" : _messageTextView, 
    @"contentView" : self.contentView, 
    @"kTopAndBottomPadding" : [NSNumber numberWithFloat:SPMTVC_kTopAndBottomPadding]}; 

// Constraints in the horizontal axis. 
// Basically just pins the view to the left and right of superview. 
NSMutableArray *constraints = [[NSLayoutConstraint 
    constraintsWithVisualFormat:@"H:|-0-[messageTextView(==contentView)]-0-|" 
    options:NSLayoutFormatAlignAllLeading 
    metrics:nil 
    views:variableBindings] mutableCopy]; 

// Constraints in vertical axis, give 5-point padding from superview's top & bottom. 
[constraints addObjectsFromArray:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"V:|-kTopAndBottomPadding-[messageTextView]-kTopAndBottomPadding-|" 
    options:NSLayoutFormatAlignAllTop 
    metrics:nil 
    views:variableBindings]]; 

for (NSLayoutConstraint *constraint in constraints) { 
    [self.contentView addConstraint:constraint]; 
} 

Myślę, że komunikat o błędzie oznacza, że ​​kompilator myśli kTopAndBottomPadding jest UIView, gdy jest to NSNumber zdefiniowane w słowniku. Czy jest jakiś sposób, aby to zrobić dobrze?

Odpowiedz

29

Po to jest słownik danych. Tak na przykład, jeśli chcesz użyć „wyściółkę” Jako stały w ciąg VFL, zrób coś takiego:

[constraints addObjectsFromArray:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"V:|-padding-[messageTextView]-kTopAndBottomPadding-|" 
    options:NSLayoutFormatAlignAllTop 
    metrics:@{@"padding":@5} 
    views:variableBindings]]; 
+1

Można tworzyć metryki słownika używając NSDictionaryOfVariableBindings (dopełnienie) Makro również. – LightningStryk

+0

Dopóki twoja klasa nie zawiera już znaków iv dla danych, nie ma wiele korzyści w porównaniu z używaniem literałów słownikowych – uchuugaka

2

Musisz podać kTopAndBottomPadding w słowniku metryk, a nie w słowniku widoków.

Możesz również po prostu skorzystać z metody addConstraints: zamiast zajmować się zmiennymi tablicami i pętlami for/in.

CGFloat const SPMTVC_kTopAndBottomPadding = 5.0; 
// ... 

NSDictionary *metrics = @{ 
    @"kTopAndBottomPadding" : @(SPMTVC_kTopAndBottomPadding) 
}; 
NSDictionary *views = @{ 
    @"messageTextView" : _messageTextView, 
    @"contentView" : self.contentView 
}; 

[self.contentView addConstraints:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"H:|-0-[messageTextView(==contentView)]-0-|" 
    options:NSLayoutFormatAlignAllLeading 
    metrics:metrics views:views]]; 

[self.contentView addConstraints:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"V:|-kTopAndBottomPadding-[messageTextView]-kTopAndBottomPadding-|" 
    options:NSLayoutFormatAlignAllTop 
    metrics:metrics views:views]]; 
Powiązane problemy