Переместить NSView из внешнего вида с помощью автоматического размещения, используя NSAnimation
Я использую автоматическую компоновку в своем проекте, и при нажатии кнопки я делаю слайд с "подробным видом" поверх "вида плитки".
"Вид плитки" выровнен по верху, низу, слева и справа. "Детальный вид" выровнен по центру x,y и равен ширине / высоте.
Я заставил анимацию работать, но мне пришлось использовать два разных метода:
1) Это мой любимый метод анимации, и он отлично работает в режиме "плитки"
CAKeyframeAnimation* tileKeyAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
tileKeyAnimation.fillMode = kCAFillModeForwards;
tileKeyAnimation.removedOnCompletion = NO;
tileKeyAnimation.keyTimes = @[@0,@0.45];
tileKeyAnimation.values = @[[NSValue valueWithCATransform3D:CATransform3DIdentity],
[NSValue valueWithCATransform3D:self.tileTransform]];
tileKeyAnimation.duration = 0.5;
[_tileView.layer addAnimation:tileKeyAnimation forKey:@"transform"];
2) Так как вышеупомянутая анимация не работала для "детального просмотра", я прибегнул к использованию другого типа анимации для нее. (Я создал выход для ограничения centreX с именем _detailedCenterXConstraint)
_detailedCenterXConstraint.constant = _tileView.bounds.size.width;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[context setTimingFunction:[[CAMediaTimingFunction alloc] initWithControlPoints:0 :0 :0 :0.45]];
[context setDuration:[self pushAnimationDuration]];
[_detailedCenterXConstraint.animator setConstant:_detailedView.bounds.size.width];
} completionHandler:^{
}];
Проблема с этим подходом состоит в том, что анимации не совпадают друг с другом. Я попытался использовать пользовательскую функцию CAMediaTimingFunction в (2) для соответствия времени анимации в (1), но кажется, что я не использую это правильно.
Есть ли причина, по которой CAKeyframeAnimation (1) не должен работать в моем "подробном представлении"?
В качестве альтернативы есть ли способ, как согласовать время анимации между двумя подходами?
1 ответ
Мне удалось получить идентичную анимацию с помощью следующего кода:
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[context setTimingFunction:0.45 :1.0 :0.45 :1.0];
[context setDuration:[self pushAnimationDuration]/2];
[_detailedCenterXConstraint.animator setConstant:_detailedView.bounds.size.width];
} completionHandler:^{
}];