mac*_*osh 13 iphone cocoa core-animation objective-c ipad
当用户点击按钮时,我正试图在iPad应用中为UI的一部分制作动画.我的动作方法中有这个代码.它的工作原理是UI改变了我的预期,但它没有动画更改.它只是立即改变.我肯定错过了什么:
- (IBAction)someAction:(id)sender {
UIViewController *aViewController = <# Get an existing UIViewController #>;
UIView *viewToAnimate = aViewController.view;
CALayer *layerToAnimate = viewToAnimate.layer;
[CATransaction begin];
[CATransaction setAnimationDuration:1.0f];
CATransform3D rotateTransform = CATransform3DMakeRotation(0.3, 0, 0, 1);
CATransform3D scaleTransform = CATransform3DMakeScale(0.10, 0.10, 0.10);
CATransform3D positionTransform = CATransform3DMakeTranslation(24, 423, 0);
CATransform3D combinedTransform = CATransform3DConcat(rotateTransform, scaleTransform);
combinedTransform = CATransform3DConcat(combinedTransform, positionTransform);
layerToAnimate.transform = combinedTransform;
[CATransaction commit];
// rest of method...
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试简化动画只是改变不透明度(例如),它仍然不会动画.不透明度立即改变.这让我相信某些东西没有正确设置.
任何线索都会有所帮助!
Mat*_*ong 30
默认情况下禁用视图根层上的动画.尝试将变换应用于视图,例如[view setTransform:CGTransform3D ...].如果必须在图层级别执行此操作,请在根图层中添加图层,然后在其上执行转换.此外,视图动画块[UIView beginAnimations ...]仅在动画视图属性时具有效果 - 而不是图层属性.
更新:
所以这是你的代码看起来像显式动画(不需要CATransaction)
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
CATransform3D rotateTransform = CATransform3DMakeRotation(0.3, 0, 0, 1);
CATransform3D scaleTransform = CATransform3DMakeScale(0.10, 0.10, 0.10);
CATransform3D positionTransform = CATransform3DMakeTranslation(24, 423, 0);
CATransform3D combinedTransform = CATransform3DConcat(rotateTransform, scaleTransform);
combinedTransform = CATransform3DConcat(combinedTransform, positionTransform);
[anim setFromValue:[NSValue valueWithCATransform3D:CATransform3DIdentity]];
[anim setToValue:[NSValue valueWithCATransform3D:combinedTransform]];
[anim setDuration:1.0f];
[layerToAnimate addAnimation:anim forKey:nil];
Run Code Online (Sandbox Code Playgroud)
请记住,这只会执行动画.实际上你必须通过调用来设置图层的transform属性:
[layerToAnimate setTransform:combinedTransform];
Run Code Online (Sandbox Code Playgroud)
同样.否则它将快速回到其起始位置.
除非在您为视图的根层设置动画的情况下,否则每次设置图层属性时都会隐式动画.在这种情况下,默认情况下关闭动画,我发现当我对动画根感兴趣时,我总是要做的是动画视图而不是图层.所以这意味着对层内树中任何层进行属性更改的调用将被隐式动画.例如:
CALayer *root = [view layer];
CALayer *sublayer = [[root sublayers] objectAtIndex:0];
[sublayer setTransform:combinedTransform];
Run Code Online (Sandbox Code Playgroud)
这是我知道(知道)你可以在图层上实际使用隐式动画的唯一方法.但是,您的代码指出的是,只需将更改放置在UIView动画块中的图层上,就可以打开根层的图层动画.这非常有趣且方便.这是一个非常有用的发现.
也许这是埋藏在某个地方的文档中,但我还没有遇到它.
| 归档时间: |
|
| 查看次数: |
9014 次 |
| 最近记录: |