4

(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
4

2 に答える 2

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 に答える