我有一个非常简单的问题,我正在拔头发。我试图动画NSButton的移动。现在,我知道这几乎过于简单了:
[[button animator] setFrame:newCGRect];
但是,我想增加按钮行进所需的时间。所以,我研究了稍微复杂的CABasicAnimation。我认为我正在做的一切正确,但NSButton根本没有动。
CGPoint center = CGPointMake(10, 20);
CALayer *layer = button.layer;
layer.position = CGPointMake(button.frame.size.width / 2, button.frame.size.height / 2);
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.fromValue = [layer valueForKey:@"position"];
[animation setToValue:[NSValue valueWithPoint:center]];
[animation setFillMode:kCAFillModeForwards];
[animation setRemovedOnCompletion:NO];
[animation setDuration:3.0];
[layer addAnimation:animation forKey:@"position"];
这里,按钮是NSButton。我将图层的位置设置为按钮的中心,因为我认为“位置”必须指向中心。然后,我正在做的就是移动(据说)按钮到中心,在一个3秒长的动画中。我将动画添加到图层,然后没有任何反应。
现在,有人知道我做错了什么吗?或者,在旁注中,无论如何使用动画属性和设置动画的长度?
答案 0 :(得分:4)
在事务中包装隐式动画以调整动画。
[CATransaction begin];
[CATransaction setAnimationDuration:3];
[[button animator] setFrame:newframe];
[CATransaction commit];
答案 1 :(得分:2)
事实证明我的原始代码过度,而Jason Harwig在下面的回答更为准确。唯一的问题是,在动画NSView子类(在本例中为NSButton)时,他没有给定持续时间的动画。为了解决这个问题,下面是以下代码,它使用给定的持续时间进行动画处理:
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:8];
[[button animator] setFrame:newRect];
[NSAnimationContext endGrouping];