Sto creando una classe di visualizzazione divisa per l'autolayout per una delle mie applicazioni. Tra le sue varie caratteristiche è che può comprimere i riquadri e può animare il loro collasso, proprio come avresti potuto vedere con NSSplitView.NSLayoutConstraint.constant ignora l'animazione
Poiché sto usando vincoli, sto ottenendo questo mettendo un vincolo larghezza richiesta = (larghezza corrente) nel pannello, e quindi impostando il costante 0 vincolo in modo animata:
- (NSLayoutConstraint*)newHiddenConstraintAnimated:(BOOL)animated {
NSLayoutConstraint * constraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:NSWidth(self.view.frame)];
constraint.priority = NSLayoutPriorityRequired;
CABasicAnimation * anim = [CABasicAnimation animation];
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
anim.duration = 0.2;
constraint.animations = [NSDictionary dictionaryWithObject:anim forKey:@"constant"];
[self.view addConstraint:constraint];
[(animated ? constraint.animator : constraint) setConstant:0.0];
return constraint;
}
Funziona magnificamente. Sfortunatamente, espandere il pannello in seguito non va così bene.
- (void)removeHiddenConstraintAnimated:(BOOL)animated {
if(!animated) {
[self.view removeConstraint:self.hiddenConstraint];
}
else {
NSLayoutConstraint * constraint = self.hiddenConstraint;
NSView * theView = self.view;
[NSAnimationContext beginGrouping];
[constraint.animator setConstant:self.width];
[NSAnimationContext currentContext].completionHandler = ^{
[theView removeConstraint:constraint];
};
[NSAnimationContext endGrouping];
}
self.hiddenConstraint = nil;
}
Se inserisco qualche codice tempi, posso vedere che il gestore di completamento spara quasi istantaneamente, eliminando il vincolo prima che abbia tempo da animare. L'impostazione di una durata su NSAnimationContext non ha alcun effetto.
Qualche idea di cosa potrei fare di sbagliato qui?
Hai mai terminato questa lezione di visualizzazione divisa? Possibilità di andare open source? –
Non ho in programma al momento. È abbastanza specializzato per questa applicazione e credo che 'NSSplitView' in [PURRDACTED] sia stato ridisegnato per funzionare meglio con l'autolayout. –
Oh, capito. Riguardo a [redacted], ha quella caratteristica carina riguardo al layout automatico, ma ovviamente non è retrocompatibile con obiettivi più vecchi. Oh bene, farò il mio credo! :) –