使用 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:^{
}];
我在我的项目中使用自动布局,并在按下按钮时让 '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:^{
}];