【问题标题】:Resizing layers and its sublayers - CoreAnimation调整图层及其子图层的大小 - CoreAnimation
【发布时间】:2010-08-20 07:43:43
【问题描述】:

我有一个 CALayer A 和一个子层 B 我想调整 A 的大小(缩小)所以我将动画添加到我的图层 A 但是当我提交动画子层 B 时并没有缩小。它的大小保持不变(但它的位置随着其超层边界的变化而变化) 如何使我的 B 层与 A 动画一起调整大小?

这是我写的:

 CABasicAnimation *fadeInAnimation; 
 fadeInAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
 fadeInAnimation.repeatCount = 1;
 fadeInAnimation.autoreverses = NO;
 fadeInAnimation.fromValue = [NSNumber numberWithFloat:1.0];
 fadeInAnimation.toValue = [NSNumber numberWithFloat:0.0];

 CABasicAnimation *shrinkAnimation;
 shrinkAnimation = [CABasicAnimation animationWithKeyPath:@"bounds.size"];
 shrinkAnimation.repeatCount = 1;
 shrinkAnimation.autoreverses = NO;
 shrinkAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
 shrinkAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(0, 0)];

 aniGroupOFF = [[CAAnimationGroup animation] retain];
 aniGroupOFF.delegate = self;
 aniGroupOFF.duration = ANI_DURATION;
 aniGroupOFF.animations = [NSArray arrayWithObjects:shrinkAnimation, fadeInAnimation, nil]; 

然后提交:

[self addAnimation:aniGroupOFF forKey:@"shrinkAndFade"];
self.opacity = 0.0;

答案:

CABasicAnimation *shrinkAnimation;
    shrinkAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; //use transform instead of bounds.size
    shrinkAnimation.repeatCount = 1;
    shrinkAnimation.autoreverses = NO;
    shrinkAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
    shrinkAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DScale(self.transform, 0.1, 0.1, 1.0)];

    aniGroupOFF = [[CAAnimationGroup animation] retain];
    aniGroupOFF.delegate = self;
    aniGroupOFF.duration = ANI_DURATION;
    aniGroupOFF.animations = [NSArray arrayWithObjects:shrinkAnimation, nil]; 

【问题讨论】:

  • 答案可能有效,但您甚至可以为“transform.scale”设置动画并使用简单的 NSNumber 作为 to 值。这就是我在回答中所说的。

标签: iphone cocoa cocoa-touch macos core-animation


【解决方案1】:

实现这一点的最简单方法是为 keyPath 设置动画“transform.scale”而不是“bounds.size”。

如果您坚持使用“bounds.size”,则需要在 A 层上实现 layoutSublayers 或在 A 的委托上实现 layoutSublayersOfLayer:(CALayer*)aLayer,并在该实现中手动调整 B 的大小。

【讨论】:

  • 谢谢,我会尝试 transform.scale,但有一件有趣的事情:我写了 [layer setNeedsDisplayOnBoundsChange:YES];并覆盖 layoutSublayer 并尝试调整子层的边界/框架,但 layoutSublayer 仅在初始化时调用。因此子层没有缩小。
  • 你在 A 层或 B 层上实现了 layoutSublayers 吗?应该是 A。我想不出为什么 A 上的 layoutSublayers 不应该在它的边界被动画时被调用。
猜你喜欢
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多