Objective c 带有CATTransaction的CALayer动画在前面加上“视图调整大小”时表现不同

Objective c 带有CATTransaction的CALayer动画在前面加上“视图调整大小”时表现不同,objective-c,cocoa-touch,core-animation,calayer,Objective C,Cocoa Touch,Core Animation,Calayer,(iOS 5.1,XCode 4.4) 编辑:当前(在iOS 7.0上),图层似乎始终忽略第一个未设置动画的更改,并始终从原始值设置动画。我无法再复制对视图大小的依赖 我有一个CALayer,其位置首先用[CatTransaction setDisableActions:YES](未设置动画)更改,然后直接用[CatTransaction setDisableActions:NO](动画)更改。通常,这将导致从第一次更改中设置的位置到第二次更改中设置的位置的动画。但是,我发现我的代码从初始位置变

(iOS 5.1,XCode 4.4)

编辑:当前(在iOS 7.0上),图层似乎始终忽略第一个未设置动画的更改,并始终从原始值设置动画。我无法再复制对视图大小的依赖

我有一个CALayer,其位置首先用[CatTransaction setDisableActions:YES](未设置动画)更改,然后直接用[CatTransaction setDisableActions:NO](动画)更改。通常,这将导致从第一次更改中设置的位置到第二次更改中设置的位置的动画。但是,我发现我的代码从初始位置变为第二次更改的位置

经过大量的测试和调试后,我发现它取决于UIView,UIView包含更改前调整大小的层。要复制的代码(iphone单视图模板,添加QuartzCore.framework):

#导入
#导入“TAViewController.h”
@接口TAViewController()
@属性(非原子,强)UIView*viewA;
@性质(非原子,强)CALayer*layerA;
@结束
@视图控制器的实现
-(iAction)按钮按下
{
self.viewA.frame=CGRectMake(0,30,320,250);
[自设置位置:CGPointMake(01100)动画:否];
[自设置位置:CGPointMake(0,150)动画:是];
}
-(void)设置位置:(CGPoint)已设置动画的位置:(BOOL)已设置动画
{
[交易开始];
如果(动画){
[CATTransaction setDisableActions:否];
[CATTransaction设置动画持续时间:5];
}否则{
[CATTransaction setDisableActions:是];
}
self.layerA.position=位置;
[CATransaction-commit];
}
-(无效)viewDidLoad
{
[超级视图下载];
self.viewA=[[UIView alloc]init];
self.viewA.backgroundColor=[UIColor darkGrayColor];
self.viewA.frame=CGRectMake(0,30,320,300);
[self.view addSubview:self.viewA];
self.layerA=[CALayer layer];
self.layerA.backgroundColor=[UIColor redColor].CGColor;
self.layerA.anchorPoint=CGPointZero;
self.layerA.frame=CGRectMake(0,032100);
[self.viewA.layer addSublayer:self.layerA];
}
@结束

在对setposition:animated的两次调用中都放置了animated:YES:因此,该方法在两次调用中都使用

[CATransaction setDisableAction:NO]
而不是

[CATransaction setDisableAction:YES]
我认为你按下按钮的方法应该改为

[self setPosition:CGPointMake(0, 100) animated:NO];
[self setPosition:CGPointMake(0, 150) animated:YES];

我遇到了一个类似的问题,通过延迟动画属性更改解决了这个问题,这可能会将它们推到下一个运行循环中,从而确保之前的属性更改在隐式动画开始之前生效

我通过使用GCD的dispatch_after()完成了这项工作,只需要很小的延迟


也可以通过使用从非动画特性值开始的显式动画来解决此问题

很抱歉,在示例中更正了此问题。正如本文所描述的,这个问题是关于第一次更改未设置动画的情况。您是否找到解决方案?
[self setPosition:CGPointMake(0, 100) animated:NO];
[self setPosition:CGPointMake(0, 150) animated:YES];