Estoy creando una clase de vista dividida para una de mis aplicaciones. Entre sus diversas características se encuentra el hecho de que puede colapsar paneles y animar su colapso, de la misma forma en que lo ha visto hacer NSSplitView.NSLayoutConstraint.constant que ignora la animación
Desde que estoy usando limitaciones, estoy lograr esto colocando una restricción de anchura requerida = (anchura actual) en el panel, y luego poner la constante a 0 la restricción de una manera animada:
- (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;
}
Esto funciona maravillosamente. Desafortunadamente, expandir el panel más tarde no le va tan bien.
- (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;
}
Si inserto un código de tiempo, puedo ver que el controlador de finalización dispara casi al instante, la eliminación de la restricción antes de que tenga tiempo para animar. Establecer una duración en NSAnimationContext no tiene ningún efecto.
¿Alguna idea de lo que podría estar haciendo mal aquí?
¿Alguna vez terminaste esta clase de vista dividida? ¿Posibilidad de que sea de código abierto? –
No pienso hacerlo por el momento. Es bastante especializado para esta aplicación, y creo que 'NSSplitView' en [PURRDACTED] se ha rediseñado para que funcione mejor con el autolayout. –
Oh, tengo. Con respecto a [redactado], tiene una buena característica en cuanto a la distribución automática, pero por supuesto no es compatible con objetivos anteriores. Oh, bueno, voy a hacer mi propia, supongo! :) –