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