(iOS 5.1、XCode 4.4)
編集:現在 (iOS 7.0)、レイヤーはアニメーション化されていない最初の変更を一貫して無視し、常に元の値からアニメーション化するようです。ビューのサイズ変更への依存を再現できなくなりました。
[CATransaction setDisableActions:YES] (アニメーション化されていない) で最初に位置が変更され、その後すぐに [CATransaction setDisableActions:NO] (アニメーション化された) で変更される CALayer があります。通常、これは最初の変更で設定された位置から 2 番目の変更で設定された位置へのアニメーションになります。ただし、コードが最初の位置から2番目の変更の位置にアニメーション化されていることがわかりました。
多くのテストとデバッグの後、変更前にサイズ変更されているレイヤーを含む 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