2013-12-11 6 views
6

ho questo semplice visione:Auto Layout: animano modifiche al moltiplicatore di NSLayoutConstraint

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    redBox = [[UIView alloc] init]; 
    [redBox setBackgroundColor:[UIColor redColor]]; 
    [redBox setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.view addSubview:redBox]; 

    //H: 
    widthConstraint = [NSLayoutConstraint constraintWithItem:redBox 
                attribute:NSLayoutAttributeWidth 
                relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                attribute:NSLayoutAttributeWidth 
                multiplier:0.5 
                constant:0.0]; 
    [self.view addConstraint:widthConstraint]; 

    //More constraints... 
} 

mi piacerebbe per animare un aumento della larghezza di Redbox.

Ho provato questo:

widthConstraint.constant = 100; 

[UIView animateWithDuration:1 
       animations:^{ 
        [self.view layoutIfNeeded]; 
       } 
]; 

questo aumenta la larghezza della visualizzazione 100 e anima, ma devo aumentarlo di una quantità proporzionale alla larghezza della sua superview. In altre parole, mi piacerebbe impostare's multiplier a 0.8.

Ma NSLayoutConstraint’s multiplier is readonly! Questo significa che devo rimuovere, modificare e riaggiungere widthConstraint ogni volta che voglio animare una modifica al suo multiplier o c'è un modo migliore?

risposta

4

Sfortunatamente, non esiste un modo migliore. Rimuovere e aggiungere nuovamente con un moltiplicatore diverso è la tua unica opzione. Si prega di inserire un bug che si desidera vedere multiplier da leggere.

+0

C'è una buona ragione che è di sola lettura; cambiarlo è costoso e richiede il ricalcolo del layout; cambiare la costante, d'altra parte, è economico. Quindi, se è possibile, ad esempio, calcolare la costante corretta e modificarla, è molto più veloce. Il readonly è lì per incoraggiare questo. –

+5

Ricalcolare dinamicamente le modifiche al layout in fase di runtime, non è esattamente ciò che è esattamente per il layout automatico? – Eric

+1

@Eric - consultare http://floriankugler.com/blog/2013/4/21/auto-layout-performance-on-ios - il costo delle prestazioni aumenta in modo esponenziale con il numero di requisiti. È possibile utilizzare Auto Layout per ricalcolare le modifiche del layout in fase di esecuzione (sostituendo completamente il vincolo), ma l'API viene scritta per incoraggiare l'utente ad adottare un approccio performante. –

2

Ho chiesto questo question prima. E siamo trovati solo in un modo, è rimuovere i vincoli e aggiunto in seguito con modifica multiplatore. @ "E 'di Apple bambino" (© My Boss)

UPD

sguardo Masonry mb si può sostituire moltiplicatore sul vincolo pianura con costante.

Problemi correlati