LoginSignup
6
3

More than 5 years have passed since last update.

UINavigationControllerでPUSH/POPするときに表示される影を消す

Last updated at Posted at 2015-05-22

7Mhro.png

@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];
6
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3