Objective c CABasicAnimation不是动画。帮忙?

Objective c CABasicAnimation不是动画。帮忙?,objective-c,cocoa,macos,core-animation,layer,Objective C,Cocoa,Macos,Core Animation,Layer,现在,在你焦躁不安之前,我说的是可可而不是可可触摸。有了这些,让我们开始吧。我最近开始为Mac电脑编程。为什么?因为它很酷。你知道什么不酷吗?不能像其他酷酷的孩子一样拥有漂亮的动画。我想不出来,如果你能帮我,你会把我头上剩下的几根头发留下来的 好的,我有一个NSCollectionView。我花了很长时间才弄明白,但不管怎样。我在Interface Builder中创建了NSCollectionView层。我听说这会让这个魔法发挥作用。我尝试了以下方法来设置集合视图的动画: //usersVie

现在,在你焦躁不安之前,我说的是可可而不是可可触摸。有了这些,让我们开始吧。我最近开始为Mac电脑编程。为什么?因为它很酷。你知道什么不酷吗?不能像其他酷酷的孩子一样拥有漂亮的动画。我想不出来,如果你能帮我,你会把我头上剩下的几根头发留下来的

好的,我有一个
NSCollectionView
。我花了很长时间才弄明白,但不管怎样。我在Interface Builder中创建了
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];

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

我认为,对于尝试隐含动画的第二段代码(通过为
变换
属性指定一个新值),您需要跳过将
kCATransactionDisableActions
属性设置为
true
,因为实际上是说不设置过渡动画(这与您的意图正好相反)。明确地说,您可以将该属性设置为
false。
也很容易出现其他问题;在编码并运行之前,我似乎永远不知道到底需要什么。(对于核心动画,我总是发现自己一点一点地接近我想要的结果。但在最终获得至少一些动画效果之后,它确实激励我继续调整代码,直到它按照我想要的方式工作!也就是说,核心动画不是一个容易获得的东西。)

至于第一个问题,即显式动画,我认为其中一个问题与设置层的变换属性的最后一行有关;我将从忽略这一点开始(尽管从长远来看,它可能需要在其他地方进行处理)。设置该转换会立即将层更改为动画完成时的外观(这就是为什么您会看到转换立即发生),但这并不能完全解释自事务(在代码完成后即立即发生转换后开始)以来未看到任何动画的原因有一个“开始”和一个“结束”值。首先,我会找到一些做类似动画的示例代码,然后一块一块地修改它以得到您想要的。(这就是我如何学会使用核心动画的原因,我自己尝试完全编写了一个动画,但失败了;我花了很长时间才把它做好,但这样做确实让我感觉更好。)您可能还想回到文档中,真正尝试了解
核心动画渲染体系结构的概念,即层树、表示树和渲染树,以及在动画的不同阶段显示的内容以及如何影响它(这也只能在一系列的尝试和错误之后才能真正理解)。只要坚持下去,直到它有意义为止!

你可能想要使用它

[usersView setWantsLayer:YES];

如果你发现你的图层为零。默认情况下,所有视图都没有图层。

经过几次尝试,我终于让我的动画开始工作了。有几件事需要注意

如果希望将变换定位在中心,则应在将视图添加到其superview之前调用
CALayer:
上的
anchorPoint
。否则子视图将从
anchorPoint
位置开始裁剪。

CALayer *layer = _completionIndicator.layer;
layer.anchorPoint = CGPointMake(.5, .5);
runAnimationGroup
块中包装动画调用(
\u 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];
        });

    });

}];
- (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

NSCollectionView
的superview也有图层支持吗?@Rob:superview,你是指包含
NSCollectionView
的视图吗?不,不是。原因是它是一个透明的窗口,我不想让视图变成难看的灰色。谢谢你花时间写出来。很好的信息n、 谢谢大家!!