2014-02-13 55 views
1

我有一个CALayer它有一个CAKeyFrameAnimationiOS - 检测CALayer内容的变化

有没有办法检测到CALayer的内容变化?

这就像,每当CALayer的内容(图像)由于CAKeyFrameAnimation而改变时,我想播放一个短的声音与AVAudioPlayer

UPDATE

我做这样的解决它。

- (void) viewDidLoad 
{ 
    // init CADisplayLink to catch the changing moment 
    CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(checkContents:)]; 
    [displayLink setFrameInterval:6] // checking by every 0.1 sec (6 frames) 
    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 
} 

- (void) checkContents:(CADisplayLink *) sender; 
{ 
    // _newImage and _oldImage are class variables. (UIImage) 
    // animatingView is a `UIImageView` where its layer's contents is being changed by `CAKeyFrameAnimation` 

    CALayer *presentLayer = [animatingView.layer presentationLayer]; 
    _newImage = presentLayer.contents; 
    if (![_newimage isEqual:_oldImage]) 
    { 
     NSLog(@"Image changed! From %@ to %@", _oldImage, _newImage); 
    } 
    _oldImage = _newImage; 
} 

当然,不要忘记在不再需要时使CADisplayLink无效。

回答

0

好像你需要一个CADisplayLink做的工作,喜欢这里描述:Detecting collision, during a CAKeyFrameAnimation

基本上是:

一个CADisplayLink对象是一个计时器对象,它允许您的应用程序的绘图同步刷新显示的速度。

您的应用程序会创建一个新的显示链接,提供一个目标对象和一个在屏幕更新时调用的选择器。接下来,您的应用程序将显示链接添加到运行循环中。

来源:Apple's documentation on CADisplayLink

+0

谢谢你快回答!我会给它一个! – Woonohyo