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