使用 NSAnimation 通过自动布局从外部视图移动 NSView

Move an NSView from outside view with autolayout using NSAnimation

我在我的项目中使用自动布局,并在按下按钮时让 'detailed view' 在 'tile view' 上滑动。

'tile view'上下左右对齐。 'detailed view' 与中心 x,y 对齐并等于 width/height.

我让动画开始工作,但是我不得不使用两种不同的方法:

1) 这是我首选的动画方法,在 'tile view'

上效果非常好
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) 由于上述动画不适用于 'detailed view',我求助于它使用不同类型的动画。 (我为名为 _detailedCenterXConstraint 的 centreX 约束创建了一个出口)

_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:^{
}];

这种方法的问题是动画彼此不匹配。我尝试在 (2) 中使用自定义 CAMediaTimingFunction 来匹配 (1) 中的动画时间,但我似乎没有正确使用它。

为什么 CAKeyframeAnimation (1) 在我的 'detailed view' 上不起作用?

或者,有没有办法在这两种方法之间匹配动画时间?

我已经成功地使用以下代码获得了相同的动画:

[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:^{
}];