导航栏半透明

前段时间被导航栏半透明的问题困扰了很久,记录下来,也希望能帮到和我一样遇到同样困扰的童鞋,第一次写,若有问题,希望大佬们多多指教。

好了,进入主题

iOS 的navigation的背景色默认是半透明的,想要实现不透明可以设置translucent属性为NO,但是这个时候原点就变了,会下移64个像素,如果你的界面布局固定,不需要做根据键盘的显示和隐藏做适配,到此也就可以结束了,但如果你和我一样要做适配,坑就来了。界面显示时,原点会比之前的下移64个像素,但是当键盘消失时,布局还原,原点又上移了64,坑啊。这个时候你就需要设置extendedLayoutIncludesOpaqueBars属性了。

extendedLayoutIncludesOpaqueBars:默认值为NO,这个属性在状态栏不透明的状态下才生效,这个时候设置为YES,就不需要再去修改布局了。

我这人有个毛病,做项目不写基类,这就意味着我可能要在每个viewController里面都要添加这两行代码,但对于如此懒的我,这简直是一种折磨。这个时候runtime 的Method Swizzling简直就是及时雨,想要了解的童鞋可以参考http://lib.csdn.net/article/ios/64799。几行代码直接搞定,直接上代码了:

#import"UIViewController+Method.h"

#import

@implementationUIViewController (Method)

+ (void)load

{

staticdispatch_once_tonceToken;

dispatch_once(&onceToken, ^{

Classclass = [selfclass];

SELoriginalSelector =@selector(viewDidLoad);

SELswizzledSeletor =@selector(new_viewDidLoad);

MethodoriginalMethod =class_getInstanceMethod(class, originalSelector);

MethodswizzledMethod =class_getInstanceMethod(class, swizzledSeletor);

if(!originalMethod || !swizzledMethod) {

return;

}

IMPoriginalIMP =method_getImplementation(originalMethod);

IMPswizzledIMP =method_getImplementation(swizzledMethod);

constchar*originalType =method_getTypeEncoding(originalMethod);

constchar*swizzleType =method_getTypeEncoding(swizzledMethod);

class_replaceMethod(class, originalSelector, swizzledIMP, swizzleType);

class_replaceMethod(class, swizzledSeletor, originalIMP, originalType);

});

}

- (void)new_viewDidLoad

{

self.navigationController.navigationBar.translucent=NO;

self.extendedLayoutIncludesOpaqueBars=YES;

self.navigationController.interactivePopGestureRecognizer.enabled=NO;

}

@end

你可能感兴趣的:(导航栏半透明)