5

Ho un controller di visualizzazione disposto in uno storyboard con l'autolayout abilitato e sto cercando un modo per modificare i vincoli per consentire alla vista di ruotare in orizzontale e riorganizzare i pulsanti sullo schermo. Quando provo il codice qui sotto, ottengo circa due dozzine di messaggi "Impossibile soddisfare i vincoli, i limiti di rottura ..." che non posso davvero decodificare.UIStoryboard come sostituire i vincoli a livello di codice?

C'è un modo per sostituire dinamicamente i vincoli da uno storyboard con vincoli che specifichi a livello di codice? Voglio sovrascrivere completamente il layout dei pulsanti che ho definito in uno storyboard.

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


} 

Aggiornato con la risposta di Rob, ecco il metodo per rimuovere i vincoli che uso

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

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

} 

risposta

10

Sembra che si desidera rimuovere solo tutti i vincoli su una vista. Poiché i vincoli su una vista sono spesso considerati da un antenato della vista, non è ovvio come rimuovere facilmente tutti i vincoli. Ma in realtà è piuttosto facile.

La rimozione di una vista dalla gerarchia della vista rimuove i vincoli tra la vista e altre viste al di fuori di essa. Quindi, è sufficiente rimuovere la vostra vista dalla sua superview e quindi aggiungerlo indietro:

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

Se ci sono vincoli fra e dei suoi discendenti, questi vincoli potrebbero essere tenuti da stessa (ma non può essere detenuto da ogni discendenti di ). Se vuoi rimuovere anche questi vincoli, puoi farlo direttamente:

// Remove any remaining constraints betwixt someView and its descendants. 
[someView removeConstraints:[someView constraints]]; 
+0

Grazie, ha funzionato! –

+0

Ho notato che la rimozione della sottoview da superview non sembra funzionare per i vincoli definiti per tale sottoview (come l'altezza e la larghezza fissate) –

+0

La seconda parte della mia risposta rimuoverà i vincoli di larghezza e altezza. –