2013-08-16 3 views
0

UIView Animation은 CAAnimation에서 지원되므로 ID가 UIView animateWithDuration:animations 일 때 CALayer의 addAnimation:forKey:이 실행됩니다. 그래서 나는 swizzling하고 그것을 출력하는 몇 가지 정보를 방법 않았다.UIView 애니메이션이 CALayer의 addAnimation을 트리거하지 않는 이유 : forKey :?

#import "CALayer+Swizzling.h" 
#import <objc/runtime.h> 

@implementation CALayer (Swizzling) 

+ (void)load 
{ 
    method_exchangeImplementations(class_getInstanceMethod([CALayer class], @selector(addAnimation:forKey:)), class_getInstanceMethod([CALayer class], @selector(hackedAddAnimation:forKey:))); 
} 

- (void)hackedAddAnimation:(CAAnimation *)animation forKey:(NSString *)key 
{ 
    [self hackedAddAnimation:animation forKey:key]; 
    if ([animation isKindOfClass:[CABasicAnimation class]]) { 
     CABasicAnimation *basicAnimation = (CABasicAnimation *)animation; 
     if ([basicAnimation.keyPath isEqualToString:@"transform"]) { 
      CATransform3D transform = [basicAnimation.fromValue CATransform3DValue]; 
      if (basicAnimation.fromValue) { 
       NSLog(@"fromValue:%@", NSStringFromCGAffineTransform(CATransform3DGetAffineTransform(transform))); 
      } 
      if (basicAnimation.toValue) { 
       NSLog(@"toValue:%@", NSStringFromCGAffineTransform(CATransform3DGetAffineTransform(transform))); 
      } 
      if (basicAnimation.byValue) { 
       NSLog(@"byValue:%@", NSStringFromCGAffineTransform(CATransform3DGetAffineTransform(transform))); 
      } 
      NSLog(@"timingFunction:%@", basicAnimation.timingFunction); 
      NSLog(@"duration:%f", basicAnimation.duration); 
     } 
    } 
} 
@end 

아무 일도 없었습니다. 하지만 UIAlertView을 표시하면 트리거됩니다.

2013-08-16 17:28:39.693 Test[81840:c07] fromValue:[0.01, 0, 0, 0.01, 0, 0] 
2013-08-16 17:28:39.694 Test[81840:c07] timingFunction:easeInEaseOut 
2013-08-16 17:28:39.695 Test[81840:c07] duration:0.200000 
2013-08-16 17:28:39.897 Test[81840:c07] fromValue:[1.1, 0, 0, 1.1, 0, 0] 
2013-08-16 17:28:39.897 Test[81840:c07] timingFunction:easeInEaseOut 
2013-08-16 17:28:39.899 Test[81840:c07] duration:0.100000 
2013-08-16 17:28:40.000 Test[81840:c07] fromValue:[0.9, 0, 0, 0.9, 0, 0] 
2013-08-16 17:28:40.000 Test[81840:c07] timingFunction:easeInEaseOut 
2013-08-16 17:28:40.001 Test[81840:c07] duration:0.100000 

답변

1

내가이 대신 actionForKey:를 스위 즐링 (swizzle) 할 경우에 레이어의 암시 적 애니메이션으로 치료를 받고 있다고 가정 입니다.

0

U는 애니메이션의 delegate를 설정 :

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"title" message:@"" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:@"", nil]; 

[alertView show]; 

이 결과?

animation.delegate = self 
+0

왜 대리인을 설정해야합니까? – limboy