2012-08-02 40 views
3

(iOS的5.1的XCode 4.4)CALayer的動畫與CATransaction表現不同由視圖前面時調整

編輯:目前(在iOS 7.0),該層似乎一致地忽略所述第一非動畫變化,和總是從原始值開始動畫。我不能再重新生成對視圖大小的依賴。

我有一個CALayer,它的位置首先隨着[CATransaction setDisableActions:YES](所以不是動畫)改變,然後直接用[CATransaction setDisableActions:NO](動畫)改變。通常,這將導致從第一次更改中設置的位置到第二次更改中設置的位置的動畫。但是,我發現我的代碼是從第二次更改的動畫從初始位置移動到位置。

經過大量的測試和調試之後,我發現它依賴於UIView,它包含在更改之前被調整大小的圖層。在這兩個您的通話YES到setPostion:代碼重現(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 
+0

你有沒有找到這個解決方案? – CharlieMezak 2013-03-29 18:37:14

+0

不,不幸的是。 – 2013-03-30 19:07:25

回答

0

你把動畫的動畫:因此,無論倍的方法是使用

[CATransaction setDisableAction:NO] 

代替

[CATransaction setDisableAction:YES] 

我覺得你按下按鈕的方法應該改成

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

對不起,在樣本中已更正。正如文中所描述的那樣,這個問題是關於第一個變化不是動畫的情況。 – 2012-08-02 20:40:44

2

我有一個類似的問題,並通過延遲動畫屬性更改來解決它,這可能會將其推入下一個運行循環,從而確保在隱式動畫開始之前先前的屬性更改已生效。

我通過使用GCD的dispatch_after()進行了非常小的延遲。

您可能也可以通過使用從非動畫屬性值開始的顯式動畫來解決此問題。