2013-03-19 86 views
2

在UIView子類,我有這樣的方法:爲什麼在將圖層添加到圖層時缺少隱式動畫?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch * aTouch = [touches anyObject]; 
    CGPoint loc = [aTouch locationInView:self]; 

    CALayer * layer = [CALayer layer]; 
    [layer setBackgroundColor: [[UIColor colorWithHue:(float)rand()/RAND_MAX saturation:1 brightness:1 alpha:1] CGColor]]; 
    [layer setFrame:CGRectMake(0, 0, 64, 64)]; 
    [layer setCornerRadius:7]; 
    [layer setPosition:loc]; 

    [layer setOpacity:0]; 

    [self.layer addSublayer:layer]; 


    CABasicAnimation * opacityAnim = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    opacityAnim.duration=2.42; 
    opacityAnim.fromValue=[NSNumber numberWithFloat:0]; 
    opacityAnim.toValue= [NSNumber numberWithFloat:1]; 
    opacityAnim.fillMode = kCAFillModeForwards; 
    opacityAnim.timingFunction= [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
    opacityAnim.removedOnCompletion=NO; 
    opacityAnim.delegate=self; 

// explicit animation is working as expected 
// [layer addAnimation:opacityAnim forKey:@"opacityAnimation"]; 

//  Why isn't the implicit animation working ? 
[layer setOpacity:1]; 
} 

我缺少什麼?我預計CALayer layer的不透明度將隱含在此方法的最後一行中。

我的解決方案

這裏是我解決了由於鄧肯的回答問題。

-(CALayer *) layerFactory:(CGPoint) loc { 
    CALayer * layer = [CALayer layer]; 
    [layer setBackgroundColor: [[UIColor colorWithHue:(float)rand()/RAND_MAX saturation:1 brightness:1 alpha:1] CGColor]]; 
    [layer setFrame:CGRectMake(0, 0, 64, 64)]; 
    [layer setCornerRadius:7]; 
    [layer setPosition:loc]; 
    [layer setOpacity:0]; 
    return layer; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch * aTouch = [touches anyObject]; 
    CGPoint loc = [aTouch locationInView:self]; 


    [CATransaction begin]; 
    CALayer * layer = [self layerFactory:loc]; 
    [self.layer addSublayer:layer]; 
    [CATransaction commit]; 


    [CATransaction begin]; 
    [CATransaction setAnimationDuration:0.45]; 
    [layer setOpacity:1]; 
    [CATransaction commit]; 

} 

你只需要把創建層和不透明兩種不同CATransaction塊modifiction。但是,將圖層的創建(而不是添加)移動到layerFactory方法並不會改變情況。

我不知道這是否是最好的解決方案,但它的工作。

+0

所以這意味着隱式動畫可以在主UIView圖層的子圖層上完成,但是在圖層本身上? – Sam 2013-10-31 11:30:10

+0

接受的答案不正確。在這裏看到正確的答案:http://stackoverflow.com/a/10456080/56149。 – an0 2014-04-09 23:55:02

+0

[核心動畫隱式動畫的可能重複不會觸發,除非在事件循環中](http://stackoverflow.com/questions/10456022/core-animation-implicit-animation-doesnt-fire-unless-in-event-loop ) – an0 2014-04-09 23:56:18

回答

4

您無法創建圖層並將其設置爲不透明,然後將透明度設置爲相同方法中的新值並獲取隱式動畫。嘗試將您的創建/配置層代碼放入CATransaction開始/結束塊中,然後將代碼設置爲將另一個事務開始/結束塊中的不透明度設置爲1。

我認爲這樣會起作用,但不得不嘗試一下。

如果這不起作用,請使用performSelector:withObject:afterDelay和延遲值0調用代碼將不透明度設置爲1.這將使系統添加不透明度爲0的圖層,然後處理作爲單獨的交易將不透明度改爲1。

相關問題