现在通用的不同样式导航栏切换实现方式如下两种
今日头条的实现:
今日头条的实现方式比较简单:
在第二个页面隐藏self.navaigationController.navigationbar,然后添加一个自己新建的UINavigationbar。
主要代码如下:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
// 新建navigationbar并将self.navigationItem push到堆栈中去。
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
或者如果集成了FDFullscreenPopGesture直接设置self.fd_prefersNavigationBarHidden = YES;可以自动控制self.navigationcontroller.navigationbar的显示和隐藏
微信的实现:
微信的实现方式其实更加优雅美观,左右切换时还可以看到导航栏上面item的淡入淡出切换效果,其实这就是系统级别自带的动效。
猜测实现方式如下:
- 将self.navigationController.navigatonBar子视图中的背景层设置为透明
[[[self.navigationController.navigationBar subviews] objectAtIndex:0] setAlpha:0];
- 为self.view添加一个跟navigationbar同样大小的UIview作为新的背景层,不同的页面自定义不同的颜色。这里采用基类实现
#import <UIKit/UIKit.h>
@interface PCBaseViewController : UIViewController
@property (nonatomic, strong) UIColor *topBarBackgroundColor;
@property (nonatomic, strong) UIView *navigationBarSeperateView; //导航栏底部的分割线
@end
#import "PCBaseViewController.h"
#import "UIColor+HEX.h"
@interface PCBaseViewController ()
@property (nonatomic, strong) UIView *topBarView;
@end
@implementation PCBaseViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[[self.navigationController.navigationBar subviews] objectAtIndex:0] setAlpha:0];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.topBarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, 64)];
self.topBarView.layer.masksToBounds = YES;
self.topBarView.backgroundColor = self.topBarBackgroundColor ? self.topBarBackgroundColor : [UIColor whiteColor];
self.navigationBarSeperateView.frame = CGRectMake(0, 63.5, ScreenWidth, 1);
self.navigationBarSeperateView.backgroundColor = [UIColor colorWithHexString:@"e3e3e3"];
[self.topBarView addSubview:self.navigationBarSeperateView];
[self.view addSubview:self.topBarView];
}
- (UIView *)topBarView {
if (!_topBarView) {
_topBarView = [UIView new];
}
return _topBarView;
}
- (UIView *)navigationBarSeperateView {
if (!_navigationBarSeperateView) {
_navigationBarSeperateView = [UIView new];
}
return _navigationBarSeperateView;
}
- (void)setTopBarBackgroundColor:(UIColor *)topBarBackgroundColor {
_topBarBackgroundColor = topBarBackgroundColor;
[self.topBarView setBackgroundColor:topBarBackgroundColor];
}
@end
- 所有的viewcontroller继承自BaseViewcontroller然后在viewdidiload中设置自定义背景层的颜色及分割线的显示隐藏。
另一中实现方式是通过分类,hook到viewcontroller的viewwillAppear方法,并在里面添加自定义视图等。但有个地方需要注意的是键盘弹出,系统提示弹出时对应的UIInputViewController、UIAlertController也会让viewwillAppear方法响应需要区分掉。