@implementation CALayer (SLB)
+ (void)load
{
SEL originalSelector = @selector(addAnimation:forKey:);
SEL overrideSelector = @selector(slb_addAnimation:forKey:);
Method originalMethod = class_getInstanceMethod(self, originalSelector);
Method overrideMethod = class_getInstanceMethod(self, overrideSelector);
method_exchangeImplementations(originalMethod, overrideMethod);
}
- (void)slb_addAnimation:(CAAnimation *)anim forKey:(NSString *)key {
UIView *view = [self delegate];
if ([NSStringFromClass([view class]) hasSuffix:@"DimmingView"]) {
view.hidden = YES;
}
[self slb_addAnimation:anim forKey:key];
}
@end
CALayerのカテゴリクラスでaddAnimation:forKey:をオーバーライドすることで実現することができます。
クラスメソッドのloadではaddAnimation:forKey:をオーバーライドするための準備です。
addAnimation:forKey:をそのままオーバーライドしようとすると、category is implementing a method which will also be implementedという警告がでるのでその対応です。ここではslb_addAnimation:forKey:という名前にしてます。
slb_addAnimation:forKey:では、影を表示しているViewをHiddenにしているだけです。
この影を出しているのは_UIParallaxDimmingViewというクラスなのでこれをHiddenにしています。
POPするときの影はappearanceで消すことができます。
[[UIImageView appearanceWhenContainedIn:NSClassFromString(@"_UIParallaxDimmingView"), nil] setHidden:YES];