2014-02-26 14 views
3

我有一個自定義的視圖(一個從UIView帶有旋轉動畫的小型指示器),它基本上有一個使用圖層動畫在中心和幾個球(另一個UIImageView)上旋轉的心臟圖標(UIImageView)。這裏是我的代碼:爲什麼CALayer動畫在加載視圖後工作,但不是在初始化之後?

-(void)performInitialization{ 
    self.backgroundColor = [UIColor clearColor]; 
    CGRect frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame]; 
    [imageView setImage:[UIImage imageNamed:@"RedHeart"]]; 
    balls = [[UIImageView alloc] initWithFrame:frame]; 
    [balls setImage:[UIImage imageNamed:@"AngularBalls"]]; 
    [self addSubview:imageView]; 
    [self addSubview:balls]; 

    [balls.layer beginRotating]; 
} 

...在我的上CALayer類別有:

-(void)beginRotatingWithAngularVelocity:(float)velocity{ 
    CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
    rotationAnimation.fillMode = kCAFillModeForwards; 
    rotationAnimation.removedOnCompletion = YES; 
    rotationAnimation.repeatCount = 999999; 
    rotationAnimation.duration = velocity; 
    rotationAnimation.cumulative = YES; 
    rotationAnimation.fromValue = [NSNumber numberWithFloat:0]; 
    rotationAnimation.toValue = [NSNumber numberWithFloat:M_PI * 2]; 
    [self addAnimation:rotationAnimation forKey:ROTATION_KEY]; 
} 

-(void)beginRotating{ 
    [self beginRotatingWithAngularVelocity:0.7]; 
} 

performInitialization被稱爲在我看來的init [WithFrame|WithCoder]方法。我在故事板的主視圖中有這些視圖中的一個,並且視圖完美地呈現動畫。如果我將自定義視圖的幾個實例放到主視圖中,它們也都完美地動畫。如果我將自己的觀點放入故事板上的任何視圖,沒有任何問題。但是,當我將同一視圖放入筆尖視圖中時,它不會生動。相同的代碼,IB中的相同設置(複製粘貼以確保所有內容都相同),但視圖仍然停留在初始視圖上,就好像沒有附加到該圖層的動畫一樣)。爲什麼會發生?我怎樣才能使這個動畫在筆尖上工作?

更新:該問題似乎與在視圖的初始化程序上使用動畫有關。在某些情況下,我正在初始化內部進行動畫製作,但有時會在加載後進行動畫製作(例如,用戶點擊了某物並正在下載某個內容)。問題似乎與前一種情況一致。我之前關於故事板和筆尖的謬誤顯然只是巧合。我已經相應地更新了標題。

回答

4

初始化爲時尚早。你需要等到視圖出現在你的界面中(通過didMoveToWindow向視圖發送信號。在此之前,視圖不是渲染樹的一部分(它的圖層/動畫是什麼)

+0

is there任何合適的地方把它放在視圖中?我試圖創建一個可重用的指示器視圖,它應該要求零代碼並支持在Interface Builder中拖放視圖並將該類設置爲我的類型,並且它應該在運行時動畫化。 –

+1

@CanPoyrazoğlu你可以嘗試'didMoveToSuperview'或者'didMoveToWindow'(後者確實表明我們現在處於界面中),但我不能保證任何東西,因爲我沒有真正嘗試過它!通常這種通過視圖控制器觸發事件​​ - 例如,在'viewWillAppear:'中,請回報你想要的結果。 – matt

+0

'didMoveToSupervie w'沒有改變任何東西,但'didMoveToWindow'工作。它解決了我的問題。你能否爲未來的訪客更新你的答案? –

相關問題