Apple has changed some behavior of UINavigationBar(see)on iOS 15, developers can override this on demands:
iOS 15 上苹果改变了导航条的部分默认行为,开发者可以自己重写:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// setup appearance
if (@available(iOS 15.0, *)) {
[[UINavigationBar appearance] setScrollEdgeAppearance:({
UINavigationBarAppearance *app = [UINavigationBarAppearance new];
[app configureWithDefaultBackground];
// init app property
// app.backgroundColor = xxx;
// app.shadowColor = xxx;
app;
})];
} else {
// Fallback on earlier versions
}
return YES;
}
How many lines of code should I write to fit in iPhone X? Zero.
我需要写多少代码来适配 iPhone X?0。
More and more apps use custom navigation bar for each different view controller, instead of one common, global navigation bar.
This project just help develops to solve this problem in a tricky way, develops use this navigation controller in a farmilar way just like you used to be, and you can have each view controller a individual navigation bar.
越来越多的应用为每一个 VC 设置单独的导航条,而不是之前那样使用一个全局统一的导航条,因为不同的 VC 有不同的视觉样式,前一个是蓝色的,后一个也许要做成红色、透明,或者干脆没有导航条。
虽然开发者可以在每个 VC 的 - (void)viewWillAppear
(想想为什么不是 - (void)viewDidLoad
) 方法中设置自己所需的样式,但是在同一个导航条上来回修改,稍不注意就会导致样式混乱。另一种实现方式,是隐藏全局那个导航条,每个 VC 自己通过 addSubview:(UIView *)view
的方式自己设置导航条。这种实现是可行的,但是使用不方便了,如:
- 无法使用
self.navigationItem.rightBarButtonItem
等来设置导航按钮,而必须自己手动往navigationBar
上加; - 无法使用
self.title
来修改导航标题,而必须自己添加监听; - 无法方便地设置
navigationBarHidden
; - 无法方便地自动调整
contentInsets
。
等等。
本项目提供一种透明的方式,让开发者像以前一样使用导航器,同时,每个 push
进来的 VC 有自己独立的导航条。
-
Custom navigation bar class support
-
Unwind support
-
Rotation support
-
Interactive pop enable and disable support
-
Interface Builder
support -
每个 VC 支持自定义的
navigationBarClass
-
支持
unwind
(不知道什么是unwind
?请参考:这里) -
支持转屏
-
支持禁用交互式返回
-
支持
Interface Builder
As an advise, please set RTRootNavigationController
as your rootViewController:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIViewController *yourController = ...;
self.window.rootViewController = [[RTRootNavigationController alloc] initWithRootViewController:yourController];
return YES;
}
you can implement following method to customize back bar button item (Recommended):
- (UIBarButtonItem *)rt_customBackItemWithTarget:(id)target
action:(SEL)action
{
return [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Back", nil)
style:UIBarButtonItemStylePlain
target:target
action:action];
}
or just set useSystemBackBarButtonItem
to YES and use the default one.
To run the example project, clone the repo, and run pod install
from the Example directory first.
Your ViewController hierarchy will change to:
RTRootNavigationController
`- RTContainerViewController
| `- RTContainerNavigationController
| `- YourViewController1
`- RTContainerViewController
`- RTContainerNavigationController
`- YourViewController2
So, if you access self.navigationController
it returns a container navigation controller, and its viewControllers
will always be 1, i.e. self
. Instead, your have to use self.rt_navigationController.rt_viewController
to get all siblings, as metioned Here and Here.
- iOS 7 and up
- Xcode 7 and up
RTRootNavigationController is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod "RTRootNavigationController"
rickytan, ricky.tan.xin@gmail.com
- JTNavigationController
- 支持全屏返回
- FDFullscreenPopGesture
- 使用原生的 UINavigationController,在
- (void)viewWillAppear
中做处理 - 支持全屏返回
- 使用原生的 UINavigationController,在
RTRootNavigationController is available under the MIT license. See the LICENSE file for more info.