NSLayoutConstraint.constant игнорирование анимации

Я создаю удобный для автоматического раскладки класс разделения представления для одного из моих приложений. Среди его различных функций - то, что он может сворачивать панели и может анимировать их сворачивание, как вы, возможно, видели NSSplitView.

Поскольку я использую ограничения, я достигаю этого, помещая ограничение ширины = (текущая ширина) на панель, а затем устанавливая константу ограничения на 0 в анимированной форме:

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

Это прекрасно работает. К сожалению, дальнейшее раскрытие панели не так хорошо.

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

Если я вставлю какой-то временной код, я могу увидеть, что обработчик завершения срабатывает почти мгновенно, удаляя ограничение до того, как он успеет оживить. Установка продолжительности NSAnimationContext не имеет никакого эффекта.

Есть идеи, что я здесь делаю неправильно?

16
задан Brent Royal-Gordon 29 February 2012 в 01:44
поделиться