4

(iOS 5.1,XCode 4.4)

编辑:目前(在 iOS 7.0 上),该图层似乎始终忽略第一个非动画更改,并且始终从原始值设置动画。我无法再重现对视图调整大小的依赖。

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

经过大量的测试和调试,我发现它依赖于包含在更改之前调整大小的图层的 UIView。代码重现(iphone单视图模板,添加QuartzCore.framework):

#import <QuartzCore/QuartzCore.h>
#import "TAViewController.h"

@interface TAViewController ()

@property (nonatomic, strong) UIView *viewA;
@property (nonatomic, strong) CALayer *layerA;

@end

@implementation TAViewController

- (IBAction)buttonPressed
{
    self.viewA.frame = CGRectMake(0, 30, 320, 250);
    [self setPosition:CGPointMake(0, 100) animated:NO];
    [self setPosition:CGPointMake(0, 150) animated:YES];
}

- (void)setPosition:(CGPoint)position animated:(BOOL)animated
{
    [CATransaction begin];
    if(animated) {
        [CATransaction setDisableActions:NO];
        [CATransaction setAnimationDuration:5];
    } else {
        [CATransaction setDisableActions:YES];
    }
    self.layerA.position = position;
    [CATransaction commit];
}

- (void)viewDidLoad
{
    [super 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, 0, 320, 100);
    [self.viewA.layer addSublayer:self.layerA];
}

@end
4

2 回答 2

2

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

我通过使用 GCD 的 dispatch_after() 以非常小的延迟做到了这一点。

您还可以通过使用从非动画属性值开始的显式动画来解决此问题。

于 2013-03-31T18:24:22.960 回答
0

您在 setPostion:Animated: 的两次调用中都添加了 animated:YES 因此,该方法两次都在使用

[CATransaction setDisableAction:NO]

代替

[CATransaction setDisableAction:YES]

我认为您的按钮按下方法应更改为

[self setPosition:CGPointMake(0, 100) animated:NO];
[self setPosition:CGPointMake(0, 150) animated:YES];
于 2012-08-02T19:49:53.193 回答