我有一個自定義的視圖(一個從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中的相同設置(複製粘貼以確保所有內容都相同),但視圖仍然停留在初始視圖上,就好像沒有附加到該圖層的動畫一樣)。爲什麼會發生?我怎樣才能使這個動畫在筆尖上工作?
更新:該問題似乎與在視圖的初始化程序上使用動畫有關。在某些情況下,我正在初始化內部進行動畫製作,但有時會在加載後進行動畫製作(例如,用戶點擊了某物並正在下載某個內容)。問題似乎與前一種情況一致。我之前關於故事板和筆尖的謬誤顯然只是巧合。我已經相應地更新了標題。
is there任何合適的地方把它放在視圖中?我試圖創建一個可重用的指示器視圖,它應該要求零代碼並支持在Interface Builder中拖放視圖並將該類設置爲我的類型,並且它應該在運行時動畫化。 –
@CanPoyrazoğlu你可以嘗試'didMoveToSuperview'或者'didMoveToWindow'(後者確實表明我們現在處於界面中),但我不能保證任何東西,因爲我沒有真正嘗試過它!通常這種通過視圖控制器觸發事件 - 例如,在'viewWillAppear:'中,請回報你想要的結果。 – matt
'didMoveToSupervie w'沒有改變任何東西,但'didMoveToWindow'工作。它解決了我的問題。你能否爲未來的訪客更新你的答案? –