5

Ich habe einen View-Controller in einem Storyboard mit Auto-Layout aktiviert und bin auf der Suche nach einer Möglichkeit, Constraints zu ändern, damit meine Ansicht in Querformat drehen und Tasten auf dem Bildschirm neu anordnen kann. Wenn ich den folgenden Code ausprobiere, bekomme ich ungefähr zwei Dutzend "Unfähigkeit, Einschränkungen zu erfüllen, Einschränkungen zu brechen ...", die ich nicht wirklich entschlüsseln kann.UIStoryboard Wie programmgesteuert Constraints zu ersetzen?

Gibt es eine Möglichkeit, Constraints dynamisch aus einem Storyboard mit Constraints, die ich programmgesteuert angeben, zu ersetzen? Ich möchte das Layout der Schaltflächen, die ich in einem Storyboard definiert habe, komplett außer Kraft setzen.

-(void)updateViewConstraints 
{ 
    [super updateViewConstraints]; 

    self.loginButton.translatesAutoresizingMaskIntoConstraints = NO; 
    self.getStartedButton.translatesAutoresizingMaskIntoConstraints = NO; 
    self.takeTourButton.translatesAutoresizingMaskIntoConstraints = NO; 



    [self.loginButton removeConstraints:self.loginButton.constraints]; 
    [self.getStartedButton removeConstraints:self.getStartedButton.constraints]; 
    [self.takeTourButton removeConstraints:self.takeTourButton.constraints]; 


    one = self.loginButton; 
    two = self.getStartedButton; 
    three = self.takeTourButton; 


    NSDictionary *metrics = @{@"height":@50.0,@"width":@100.0,@"leftSpacing":@110.0}; 
    NSDictionary *views = NSDictionaryOfVariableBindings(one,two,three); 

    [self.view removeConstraints:activeTestLabelConstraints]; 
    [activeTestLabelConstraints removeAllObjects]; 

    if(isRotatingToLandscape) 
    { 

     [self registerConstraintsWithVisualFormat:@"|-[one(two)]-[two(three)]-[three]-|" options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"V:[one(height)]-|" options:0 metrics:metrics views:views]; 

    }else 
    { 

     [self registerConstraintsWithVisualFormat:@"|-leftSpacing-[one(width)]" options:0 metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"[two(width)]" options:0 metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"[three(width)]" options:0 metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"V:[one(height)]-[two(75)]-[three(100)]-|" options:NSLayoutFormatAlignAllCenterX metrics:metrics views:views]; 
    } 


} 

mit Robs Antwort aktualisiert, hier ist die Methode Einschränkungen zu entfernen, die ich

-(void)removeConstraintForView:(UIView*)viewToModify 
{ 

    UIView* temp = viewToModify; 
    [temp removeFromSuperview]; 
    [self.view addSubview:temp]; 

} 

Antwort

10

Es verwenden klingt wie Sie nur auf alle Einschränkungen Ansicht entfernen möchten. Da Einschränkungen für eine Ansicht oft von einem Vorfahren der Ansicht gehalten werden, ist es nicht offensichtlich, wie alle Beschränkungen leicht entfernt werden können. Aber es ist eigentlich ziemlich einfach.

Durch das Entfernen einer Ansicht aus der Ansichtshierarchie werden alle Beschränkungen zwischen der Ansicht und anderen Ansichten außerhalb der Ansichtshierarchie entfernt. So entfernen Sie Ihre Ansicht von seiner Superview und fügen Sie dann zurück:

// Remove constraints betwixt someView and non-descendants of someView. 
UIView *superview = someView.superview; 
[someView removeFromSuperview]; 
[superview addSubview:someView]; 

Wenn es irgendwelche Einschränkungen betwixt und seine Nachkommen, könnten diese Einschränkungen durch statt selbst (kann aber nicht durch Nachkommen von gehalten werden). Wenn Sie diese Einschränkungen auch entfernen möchten, können Sie dies direkt tun:

+0

Danke, das hat funktioniert! –

+0

Mir ist aufgefallen, dass das Entfernen der Unteransicht aus Superview nicht für die für diese Unteransicht definierten Einschränkungen funktioniert (wie fixierte Höhe und Breite) –

+0

Der zweite Teil meiner Antwort entfernt die Einschränkungen für Breite und Höhe. –