iOS 15 导航栏适配问题附解决方案

在做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

你可能感兴趣的:(iOS 15 导航栏适配问题附解决方案)