在做iOS 15的适配过程中,导航栏适配遇到了一个奇怪的问题,就是原来隐藏的返回按钮的文字,失效了。
上代码
// AppDelegate.m
// 定制返回按钮
UIImage *backButtonImage = [[UIImage imageNamed:@"custom_back_icon"] imageWithPadding:UIEdgeInsetsMake(8, 8, -8, 0)];
// 隐藏返回按钮文字
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, -200) forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
// 导航栏样式
[[UINavigationBar appearance] setTintColor:[UIColor colorFromHex:@"#1B1C33"]];
[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
[[UINavigationBar appearance] setBackIndicatorImage:backButtonImage];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backButtonImage];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
UIColor *color = [UIColor blackColor];
UIFont *font = [UIFont fontWithName:@"PingFangSC-Medium" size:17.0f];
[dict setObject:color forKey:NSForegroundColorAttributeName];
[dict setObject:font forKey:NSFontAttributeName];
[[UINavigationBar appearance] setTitleTextAttributes:dict];
// iOS 15适配
if (@available(iOS 13.0, *)) {
UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
[appearance setBackgroundColor:[UIColor whiteColor]];
[appearance setShadowImage:[UIImage createImageWithColor:[UIColor whiteColor]]];
appearance.titleTextAttributes = dict;
[appearance setBackIndicatorImage:backButtonImage transitionMaskImage:backButtonImage];
[[UINavigationBar appearance] setScrollEdgeAppearance: appearance];
[[UINavigationBar appearance] setStandardAppearance:appearance];
}
我将最后的iOS 15适配的内容注释掉,则导航栏返回按钮的文案可以正常隐藏,加上这段逻辑则不能隐藏。有大佬遇到过这类问题吗?求助大佬帮忙看看。
后来参考了overstackflow上的解决办法,解决了此问题。根本原因是 UINavigationBarAppearance 的配置会覆盖原有的配置导致隐藏返回按钮文案失效。代码如下
// iOS 15适配
if (@available(iOS 15.0, *)) {
UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
[appearance setBackgroundColor:[UIColor whiteColor]];
[appearance setShadowImage:[DFCMacros createImageWithColor:[UIColor whiteColor]]];
appearance.titleTextAttributes = dict;
[appearance setBackIndicatorImage:backButtonImage transitionMaskImage:backButtonImage];
// UINavigationBarAppearance 会覆盖原有的导航栏设置,这里需要重新设置返回按钮隐藏
appearance.backButtonAppearance.normal.titlePositionAdjustment = UIOffsetMake(NSIntegerMin, -200);
[[UINavigationBar appearance] setScrollEdgeAppearance: appearance];
[[UINavigationBar appearance] setStandardAppearance:appearance];
}
stackoverflow问题地址 https://stackoverflow.com/questions/59882220/uibarbuttonitem-setbackbuttontitlepositionadjustment-doesnt-work