2011-06-26 98 views
2

现在,在你得到所有的蚂蚁之前,这是可可我说的是,而不是可可触摸。就这样,让我们​​开始吧。我最近开始为Mac编程。为什么?因为它很酷。你知道什么不是很酷吗?无法像其他酷炫的孩子一样拥有漂亮的花式动画。我无法弄清楚这一点,如果你能帮助我,你将挽救我留在我头上的少数头发。CABasicAnimation不是动画。帮帮我?

好的,我有一个NSCollectionView。花了我很多时间来弄清楚,但无论如何。我已经在界面生成器中对该层进行了NSCollectionView。我听说这应该会让这个神奇的工作。我想这对我的动画集合视图:

//usersView is my NSCollectionView 
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];  
CATransform3D scale = CATransform3DMakeScale(2.0, 2.0, 0.0); 
[anim setFromValue:[NSValue valueWithCATransform3D:CATransform3DIdentity]]; 
[anim setToValue:[NSValue valueWithCATransform3D:scale]]; 
[anim setDuration:1.0f]; 
[[usersView layer] addAnimation:anim forKey:nil]; 
[[usersView layer] setTransform:scale]; 

现在,这里的交易:它变换的观点,但不与酷动画。我也试过这个:

[CATransaction begin]; 
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 
[CATransaction setValue:[NSNumber numberWithFloat:3.0f] forKey:kCATransactionAnimationDuration]; 
[usersView layer].transform = CATransform3DMakeScale(2.0, 2.0, 0.0); 
[CATransaction commit]; 

没有骰子。我确实相信我需要帮助。谢谢。

+0

“NSCollectionView”的超级视图是否也支持层? –

+0

@Rob:通过superview,你的意思是包含'NSCollectionView'的视图吗?不,这不对。原因是因为它是一个透明窗口,我不希望视图变成丑陋的灰色。 – Catastrophe

回答

1

我认为,试图暗示动画(通过指定为transform属性的新值)的第二部分的代码,你需要跳过,说不是动画效果设置kCATransactionDisableActions属性true自过渡(这与你的意图完全相反)。为了明确你可以设置该属性为false.也可能很容易出现其他一些问题。在编码和运行之前,我似乎从不知道到底需要什么。 (随着核心动画,我总是发现自己正在逐渐趋向于我想要的结果,但最终得到至少来动画它真的激励我继续调整代码,直到它按照我想要的方式工作,即,核心动画不容易拾取。)

至于第一个问题,显式动画,我相信一个问题与设置图层的transform属性的最后一行有关;我会开始把它放在外面(尽管从长远来看,它可能需要在其他地方反击)。设置该转换会立即将图层更改为动画完成时的外观(这就是您看到转换立即发生的原因),但这并不能完全解释自从事务以来没有看到任何动画(一旦代码完成就开始动画即即时转换发生后)确实具有“开始”和“结束”值。首先,我会先找到一些示例代码,它会执行类似的动画并逐个改变它以获得您想要的内容。 (这就是我在尝试完全编写自己的动画代码并使其失败之后学会了使用核心动画的原因;确实需要很长时间才能正确使用动画,但我真的对此有了更好的感觉)。要回到文档,真正尝试获得core animation rendering architecture,即层树的概念,呈现树渲染树,在动画的不同阶段所显示的内容以及如何影响它(在一系列试验和错误之后,它们将再次陷入困境)。只要坚持下去,直到它是有道理的!

+0

感谢您抽出时间写出所有内容。伟大的信息。谢谢! – Catastrophe

1

您可能需要使用

[usersView setWantsLayer:YES]; 

,如果你弄清楚,你的层是零。默认情况下,所有视图都没有图层。

+0

这个给我修好了,谢谢! – Romejanic

0

经过几次尝试,我终于得到了我的动画工作。有几件事要注意我们的。

如果你想转换到锚定在中心,那么你应该在CALayer:致电anchorPoint之前添加以它的父!否则,子视图将从anchorPoint位置开始切割。

CALayer *layer = _completionIndicator.layer; 
layer.anchorPoint = CGPointMake(.5, .5); 

裹在一个runAnimationGroup块动画调用(_completionIndicator是定义为NSView一个属性,centerInSuperview定义如下):

[self.contentView addSubview:_completionIndicator]; 
[_completionIndicator centerInSuperview]; 

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { 
    CGFloat duration = <#duration#>; 

    CALayer *layer = _completionIndicator.layer; 
    CABasicAnimation *animation; 

    //Transform 
    animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
    animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(<#scale#>, <#scale#>, 1.0)]; 
    animation.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; 
    [animation setDuration:duration]; 
    animation.fillMode = kCAFillModeForwards; 
    animation.removedOnCompletion = NO; 
    [layer addAnimation:animation forKey:@"zoomIn"]; 

    //Fade 
    animation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    animation.fromValue = [NSNumber numberWithFloat:0.0]; 
    animation.toValue = [NSNumber numberWithFloat:1.0]; 
    [animation setDuration:duration]; 
    animation.fillMode = kCAFillModeForwards; 
    animation.removedOnCompletion = NO; 
    [layer addAnimation:animation forKey:@"fadeIn"]; 
} completionHandler:^{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
     [NSThread sleepForTimeInterval:<#seconds#>]; 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      [self hideCompletionIndicator]; 
     }); 

    }); 

}]; 

设置fillMode是一个必不可少流畅的动画。默认值为kCAFillModeRemoved,在第一次运行后运行动画时会导致跳转。

在OSX 10.11上,不需要在NSView上设置wantsLayer。我不知道以前的版本。

要隐藏视图,只需相反执行,并且移除在完成块中的视图:

- (void) hideCompletionIndicator 
{ 
    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { 
     CGFloat duration = <#duration#>; 

     CALayer *layer = _completionIndicator.layer; 
     CABasicAnimation *animation; 

     //Transform 
     animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
     animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; 
     animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(<#scale#>, <#scale#>, 1.0)]; 
     [animation setDuration:duration]; 
     animation.fillMode = kCAFillModeForwards; 
     animation.removedOnCompletion = NO; 
     [layer addAnimation:animation forKey:@"zoomOut"]; 

     //Fade 
     animation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
     animation.fromValue = [NSNumber numberWithFloat:1.0]; 
     animation.toValue = [NSNumber numberWithFloat:0.0]; 
     [animation setDuration:duration]; 
     animation.fillMode = kCAFillModeForwards; 
     animation.removedOnCompletion = NO; 
     [layer addAnimation:animation forKey:@"fadeOut"]; 
    } completionHandler:^{ 
     [_completionIndicator removeFromSuperview]; 
    }]; 
} 

的NSView类别执行

@implementation NSView (Additions) 

- (void) centerInSuperview 
{ 
    [self centerInView:[self superview]]; 
} 

- (void) centerInView:(NSView *)otherView 
{ 
    int w = self.frame.size.width; 
    int h = self.frame.size.height; 
    int x = (otherView.frame.size.width - w)/2; 
    int y = (otherView.frame.size.height - h)/2; 

    self.frame = NSMakeRect(x, y, w, h); 

} 

@end 

的NSView类别接口

@interface NSView (Additions) 

- (void) centerInSuperview; 
- (void) centerInView:(NSView *)otherView; 

@end