2012-11-02 12 views
7

ciągu mojego głównego widoku kontrolerze Dodaję widok kontrolera widoku dziecka jako podrzędny, w następujący sposób:Korzystanie iOS Auto Layout ustalenie ograniczeń między kontrolerem widoku dziecko i jego widzenia dominującej

ChildViewController *cvc = [[ChildViewController alloc] init]; 
[self addChildViewController:cvc]; 
[self.view addSubview:cvc.view]; 
[cvc didMoveToParentViewController:self]; 

i ja Teraz chciałbym użyć NSLayoutConstraint do ustawienia cvc.view w widoku macierzystym (self.view), tak, że cvc.view zajmuje pozycję 25 punktów nad spodem widoku rodzica. Rozumiem, że następujące czynności powinny działać:

UIView *superview = self.view; 
UIView *childview = cvc.view; 
NSLayoutConstraint *cn = 
    [NSLayoutConstraint withItem:childview 
     attribute:NSLayoutAttributeBottom 
     relatedBy:NSLayoutRelationEqual 
     toItem:superview attribute:NSLayoutAttributeBottom 
     multiplier: 1.0 
     constant: -25.0]; 
[superview addConstraint: cn]; 

Ale ograniczenie nie powiedzie się w czasie wykonywania. Początkowo sądziłem, że maska ​​autoreizingująca w widoku podrzędnym powodowała problemy (i śledząc wideo wstępne WWDC 2012 na automatycznym layoucie), więc ustawiłem [childview setTranslatesAutoresizingMaskIntoConstraints:NO], ale wtedy widok potomny po prostu się nie wyświetla.

Co robię źle?

Odpowiedz

3

Nie jestem pewien, ale dodaje powinny działać, albo coś bardzo podobnego:

UIView *superview = self.view; 
UIView *childview = cvc.view; 
NSDictionary *constrainedViews = NSDictionaryOfVariableBindings(childview); 
NSArray *constraints = 
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[childview]-25-|" 
                    options:0 
                    metrics:nil 
                    views:constrainedViews]; 

Jeśli nie upewnij się, że jesteś rzeczywiście ustawienie rozmiaru dla childview, coś jak:

UIView *superview = self.view; 
UIView *childview = cvc.view; 
NSDictionary *constrainedViews = NSDictionaryOfVariableBindings(childview); 
NSArray *constraints = 
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[childview]|" 
                    options:0 
                    metrics:nil 
                    views:constrainedViews]; 

Powiedz, aby wypełnić szerokość widoku. Lub:

UIView *superview = self.view; 
UIView *childview = cvc.view; 
NSDictionary *constrainedViews = NSDictionaryOfVariableBindings(childview); 
NSArray *constraints = 
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[childview(>100,<304)]-|" 
                    options:0 
                    metrics:nil 
                    views:constrainedViews]; 

Co oznacza, że ​​coś jak podglądzie powinno mieć szerokość większą niż 100, ale mniejszą niż 304 z domyślnymi marginesami do superview. Proszę zauważyć, że nie wiem, czy powyższe ograniczenie ma sens (np. Może zawsze dawać dziecku 304 szerokości, ponieważ zostawiłoby to domyślne marginesy), ale służy za przykład.

0

Aby poprawnie skonfigurować i wielkość dziecko widok kontroler z układem automatycznego wykonaj następujące czynności:

childView.translatesAutoresizingMaskIntoConstraints = NO; 

NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:superview attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:childview attribute:NSLayoutAttributeLeft multiplier:1 constant:0]; 
[self.view addConstraint:left]; 
NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:superview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:childview attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
[self.view addConstraint:top]; 
NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:superview attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:childview attribute:NSLayoutAttributeWidth multiplier:1 constant:0]; 
[self.view addConstraint:width]; 
NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:superview attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:childview attribute:NSLayoutAttributeHeight multiplier:1 constant:0]; 
[self.view addConstraint:height]; 

Jeśli wolisz format wizualny można wykonać następujące czynności:

childView.translatesAutoresizingMaskIntoConstraints = NO; 

NSDictionary *views = @{@"childview": childview}; 
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[childview]-0-|" options:0 metrics:nil views:views]]; 
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[childview]-0-|" options:0 metrics:nil views:views]]; 
Powiązane problemy