Brad Larson의 답변 외에도 사용자 정의 레이어 (사용자가 만든 레이어)의 경우 레이어를 수정하는 대신 위임 을 사용할 수 있습니다actions
사전 . 이 방법은보다 역동적이고 성능이 우수 할 수 있습니다. 또한 애니메이션 가능한 모든 키를 나열하지 않고도 모든 암시 적 애니메이션을 비활성화 할 수 있습니다.
불행히도, UIView
각각 UIView
은 이미 자체 레이어의 대리자 이므로 s를 사용자 정의 레이어 대리자로 사용할 수 없습니다 . 그러나 다음과 같은 간단한 도우미 클래스를 사용할 수 있습니다.
@interface MyLayerDelegate : NSObject
@property (nonatomic, assign) BOOL disableImplicitAnimations;
@end
@implementation MyLayerDelegate
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
if (self.disableImplicitAnimations)
return (id)[NSNull null]; // disable all implicit animations
else return nil; // allow implicit animations
// you can also test specific key names; for example, to disable bounds animation:
// if ([event isEqualToString:@"bounds"]) return (id)[NSNull null];
}
@end
사용법 (보기 내부) :
MyLayerDelegate *delegate = [[MyLayerDelegate alloc] init];
// assign to a strong property, because CALayer's "delegate" property is weak
self.myLayerDelegate = delegate;
self.myLayer = [CALayer layer];
self.myLayer.delegate = delegate;
// ...
self.myLayerDelegate.disableImplicitAnimations = YES;
self.myLayer.position = (CGPoint){.x = 10, .y = 42}; // will not animate
// ...
self.myLayerDelegate.disableImplicitAnimations = NO;
self.myLayer.position = (CGPoint){.x = 0, .y = 0}; // will animate
때때로 뷰의 컨트롤러를 뷰의 커스텀 서브 레이어의 델리게이트로 사용하는 것이 편리합니다. 이 경우 도우미 클래스가 필요하지 않으며 actionForLayer:forKey:
컨트롤러 내부에서 메서드 를 직접 구현할 수 있습니다 .
중요 사항 : UIView
기본 레이어 의 위임을 수정하지 마십시오 (예 : 암시 적 애니메이션 사용). 나쁜 일이 발생합니다.)
참고 : 레이어 다시 그리기에 애니메이션을 적용하지 않으려면 애니메이션을 비활성화하지 않는 경우가 있습니다. 실제 다시 그리기는 때때로 나중에 발생할 수 있기 때문에 [CALayer setNeedsDisplayInRect:]
호출 CATransaction
할 수 없습니다. 이 답변에 설명 된 대로 사용자 지정 속성을 사용하는 것이 좋습니다 .
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ });