2010-12-05 4 views
2

NSView에 CATransition 애니메이션을 추가하고 싶습니다.CIFilter를 사용한 CATransition이 처음 작동하지 않습니다. 두 번째로 작동합니다.

[contentView setWantsLayer:YES]; 
NSRect rect = [contentView bounds]; 

NSData *shadingBitmapData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"restrictedshine" ofType:@"tiff"]]; // took from Apple's example 
NSBitmapImageRep *shadingBitmap = [[[NSBitmapImageRep alloc] initWithData:shadingBitmapData] autorelease]; 
CIImage *inputShadingImage = [[[CIImage alloc] initWithBitmapImageRep:shadingBitmap] autorelease]; 
CIFilter *transitionFilter = [CIFilter filterWithName:@"CIRippleTransition"]; 
[transitionFilter setDefaults]; 
[transitionFilter setValue:[CIVector vectorWithX:NSMidX(rect) Y:NSMidY(rect)] forKey:@"inputCenter"]; 
[transitionFilter setValue:[CIVector vectorWithX:rect.origin.x Y:rect.origin.y Z:rect.size.width W:rect.size.height] forKey:@"inputExtent"]; 
[transitionFilter setValue:inputShadingImage forKey:@"inputShadingImage"]; 

CATransition *presentAnimation = [CATransition animation]; 
[presentAnimation setFilter:transitionFilter]; 
[presentAnimation setDuration:1.0]; 
[presentAnimation setDelegate:self]; 

[contentView setAnimations:[NSDictionary dictionaryWithObject:presentAnimation forKey:@"subviews"]]; 
// maybe there are memory leaks in this code, don't bother at this moment 

문제는 다음과 같습니다 :

  1. 이 코드를 실행 나는 다음과 같은 코드가 있습니다.

  2. 나는 처음으로 [[contentView animator] addSubview:mySubview];을 수행하지만 작동하지 않습니다. 보기가 나타납니다. CATransition 대리자 메서드가 호출되지만 finished 플래그가 NO (거짓)입니다.

  3. [mySubview removeFromSuperview];로보기를 제거하고 애니메이션을 사용하여 finished flag = YES (true)를 제거합니다.

  4. 2 단계와 3 단계를 반복하여 애니메이션과 함께 작동합니다. 이제 2 단계에서는 애니메이션이 finished (예)이라고 알려줍니다. 예상대로 작동합니다.

무엇이 잘못 되었습니까?

답변

2

문제가 해결되었습니다.

우선 : [contentView setWantsLayer:YES];이며 애니메이션을 수행하기 전에 설정해야합니다. 더 나은 장소는 awakeFromNib 또는 init 방법 또는 이와 비슷한 것입니다. contentView에서 Core Animation을 활성화하고 UI 드로잉을 수행 한 다음 (즉, 앱에서이 작업을 수행하도록 허용 함) 애니메이션을 수행해야합니다. 제 경우에는 Core Animation을 활성화하고 즉시 애니메이션을 수행했기 때문에 그것이 저에게 효과가 없었습니다.