iOS 15 适配踩坑:NavigationBar、UITabBar失效问题

苹果前两天推出了iOS 15。秋天都等不及~~

相关链接:ios 15.0 适配问题:NavigationBar和UITabBar失效问题

Xcode 13 beta版,iOS 15 beta 3的系统。
除了客户提出的问题,自己还发现了两处UI异常,不过说不定苹果能良心发现,在正式版中给修复一下。

一、企业签名的 App 无法使用

客户反馈说 App 不能正常打开,并且提示下面的这种信息:

“xxx”Needs to Be Updated : The developer of this app needs to update it to work with this version of iOS.

“xxx”需要更新 :App开发者需要更新此App以在此iOS版本上正常工作。

<center style="box-sizing: border-box; color: rgb(201, 202, 204); font-family: Menlo, "Meslo LG", monospace; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(29, 31, 33); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

猜测是需要重签名或者使用最新的 Xcode 打包。

我看苹果论坛上有人说必须使用新的 Xcode 以适配 iOS 15,但我用旧版的 Xcode 重新打了一个包,也可以解决这个问题。所以,不方便更新 Xcode 的话,可以尝试重签名试试。

睡了一觉之究极补充: 签名问题与 Xcode 版本无关,而是 Mac 系统导致的,将 macOS 升级到 11.* Big Sur 以上再进行重新签名,可以解决 App 无法使用的问题。

二、 NavigationBar 颜色及背景失效

1. 问题描述

项目中往往会自定义一个导航控制器,方便全局指定导航条的背景色、标题颜色等等。以设置背景色和标题颜色为例:

//背景色
self.navigationBar.barTintColor = RGB(42, 109, 240);
//Title 颜色
NSDictionary *titleTextAttributes = @{NSFontAttributeName:[UIFont fontWithName:@"" size:18], NSForegroundColorAttributeName:RGB(255, 255, 255)};
[self.navigationBar setTitleTextAttributes:titleTextAttributes];

但在 iOS 15上发现,指定的背景色失效了,但滚动控制器的视图时,导航条的背景又出现了。看了一眼 UINavigationBar 的 API,15中并没有新增的。倒是有几个 iOS 13新增的 API 我没用过……哈哈哈,写到这里觉得自己以前的功课落下太多了,13的更新还没学习呢😂😂😂😂😂

2. iOS 13新增 API

  • standardAppearance : 描述导航栏以标准高度显示时要使用的外观属性。
@property (nonatomic, readwrite, copy) UINavigationBarAppearance *standardAppearance;
  • compactAppearance : 描述导航栏在紧凑高度时使用的外观属性。如果未设置,则将使用标准外观。
@property (nonatomic, readwrite, copy, nullable) UINavigationBarAppearance *compactAppearance;
  • scrollEdgeAppearance : 描述当关联的 UIScrollView 向上滚动时要使用的导航栏的外观属性。如果未设置,将改用修改后的standardAppearance。
@property (nonatomic, readwrite, copy, nullable) UINavigationBarAppearance *scrollEdgeAppearance;
  • compactScrollEdgeAppearance : 描述当导航栏以紧凑的高度显示时,以及关联的 UIScrollView 往上滚动时,要使用的导航栏的外观属性。如果未设置,则首先尝试 scrollEdgeAppearance,如果为nil,则尝试 compactAppearance,然后尝试修改 standardAppearance。
@property(nonatomic,readwrite, copy, nullable) UINavigationBarAppearance *compactScrollEdgeAppearance;

3. 解决办法

根据我们的问题现象,猜测是 standardAppearancescrollEdgeAppearance 需要调整,如果正常状态和滚动状态颜色一样,可以修改如下:

NSDictionary *titleTextAttributes = @{NSFontAttributeName:[UIFont fontWithName:MAIN_FONT_FAMILY size:18], NSForegroundColorAttributeName:RGB(255, 255, 255)};
if (@available(iOS 13.0, *)) {
 UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
 appearance.backgroundColor = RGB(42, 109, 240);
 appearance.titleTextAttributes = titleTextAttributes; 
 self.navigationBar.standardAppearance = appearance;
 self.navigationBar.scrollEdgeAppearance = appearance;
} else {
 // Fallback on earlier versions
 self.navigationBar.barTintColor = RGB(42, 109, 240);
 [self.navigationBar setTitleTextAttributes:titleTextAttributes];
}

Bingo!颜色显示正常啦

所以这是什么意思?强买强卖吗?必须设置 Appearance 才可以?

4. 遗留问题

在 Xcode 13-beta 中,必须同时指定 standardAppearancescrollEdgeAppearance 才可以。但根据苹果的注释,如果 scrollEdgeAppearance 为nil,会默认使用 standardAppearance 啊。燃鹅并不行。不知道是苹果的 bug 还是怎么的……朋友昨天叫我一起转行了,因为他觉得苹果的系统做的一年不如一年~ 😂

三、UITabBar 背景图失效

这个问题有点类似上一个,UITabBar 之前设置的背景图片,老版本可以,iOS 15上表现为空白。参考问题二的思路,找到了下面的 API,做个兼容就可以了。当然,遗留问题同上,必须同时指定 standardAppearancescrollEdgeAppearance 才可以……🙄……而且,如果在初始化以后,某个时机单独修改了 standardAppearance,也必须要同步指定一下 scrollEdgeAppearance ……🙄

  • API
@property (nonatomic, readwrite, copy) UITabBarAppearance *standardAppearance;//ios 13.0.
@property (nonatomic, readwrite, copy, nullable) UITabBarAppearance *scrollEdgeAppearance;//ios 15.0.
  • 老方式
[self.tabBar setBackgroundImage:[img imageWithRenderingMode:(UIImageRenderingModeAlwaysOriginal)]];
  • 兼容新的API
UIImage *img = [UIImage imageNamed:@"ahaaaaa"];
if (@available(iOS 13.0, *)) {
 UITabBarAppearance *appearance = [[UITabBarAppearance alloc] init];
 appearance.backgroundImage = img;
 appearance.backgroundImageContentMode = UIViewContentModeScaleToFill;
 self.tabBar.standardAppearance = appearance;
 if (@available(iOS 15.0, *)) {
 self.tabBar.scrollEdgeAppearance = appearance;
 } else {
 // Fallback on earlier versions
 }
} else {
 // Fallback on earlier versions
 [self.tabBar setBackgroundImage:[img imageWithRenderingMode:(UIImageRenderingModeAlwaysOriginal)]];
}

|

四、UITabBarItem 文字颜色失效

……还是同上,新版本中 UITabBarItem 文字颜色的修改不起作用。同样是在 iOS 13 中新增的 UITabBarItemAppearance 来修改 Item 的不同状态下的不同表现。遗留问题同上。

  • 相关的类型如下,其他的API就不贴了:

UITabBarItemAppearanceUITabBarItemStateAppearance

/// The appearance when the tab bar item is in the normal state
@property (nonatomic, readonly, strong) UITabBarItemStateAppearance *normal;

/// The appearance when the tab bar item is in the selected state
@property (nonatomic, readonly, strong) UITabBarItemStateAppearance *selected;

/// The appearance when the tab bar item is in the disabled state
@property (nonatomic, readonly, strong) UITabBarItemStateAppearance *disabled;

/// The appearance when the tab bar item is in the focused state
@property (nonatomic, readonly, strong) UITabBarItemStateAppearance *focused;
  • 兼容新的API
//Set tabBar style.
UIColor *normalTitleColor = RGBA(80, 80, 81, 1);
UIColor *selectedTitleColor = RGBA(42, 109, 240, 1);
if (@available(iOS 13.0, *)) {
 UITabBarItemAppearance *itemAppearance = [[UITabBarItemAppearance alloc] init];
 itemAppearance.normal.titleTextAttributes = @{NSForegroundColorAttributeName : normalTitleColor};
 itemAppearance.selected.titleTextAttributes = @{NSForegroundColorAttributeName : selectedTitleColor};
 UITabBarAppearance *appearance = [[UITabBarAppearance alloc] init];
 appearance.stackedLayoutAppearance = itemAppearance;
 self.tabBar.standardAppearance = appearance;
 if (@available(iOS 15.0, *)) {
 self.tabBar.scrollEdgeAppearance = appearance;
 } else {
 // Fallback on earlier versions
 }
}else if (@available(iOS 10.0, *)) {
 self.tabBar.tintColor = normalTitleColor;
 self.tabBar.unselectedItemTintColor = selectedTitleColor;
}else {
 // Fallback on earlier versions
}

五、 UITableView Header 高度失效

通常 TableView 第一个分组如果不需要 Header 的话,我们会给个0.01的高度,看上去就是顶部没有空白的效果。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
 return 0.01;
}

但在 iOS 15上视图的顶部默认会下沉几个像素,我以为磨人的 automaticallyAdjustsScrollIndicatorInsets 这类小妖精又出现了,尝试了一下好像不是这类问题。😂

看了一眼官网的 API 变动,发现了一个小秘密:

The amount of padding above each section header.

每个分组Header上方的填充量。

@property(nonatomic) CGFloat sectionHeaderTopPadding;

所以我就这样:

if (@available(iOS 15.0, *)) {
 self.tableView.sectionHeaderTopPadding = 0;
}

试着改了一下,毕竟试试又不会怀孕。好了……有那么一瞬间我仿佛能理解苹果为什么加这个属性,貌似真的有场景会用到这个间距。冷静了一下,我发现我还是太菜了,理解不了~~~~~

六、UITextField 的 clearButton 向右偏移

_UITextFieldClearButton 向右偏移了一点儿点儿…有点压到边框,倒是不影响使用,然后我也不知道怎么改,谁知道告诉我一下。阿里嘎多~


目前就发现了这几个问题。希望秋天到来的时候,开发者们不用花太多时间在 UI 适配上。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 本文作为自己准备适配iOS15所用,在开始适配之前,先去学习各位同学的文章,记录在此备用。 1、导航栏UINavi...
    iOS_zy阅读 14,359评论 5 61
  • 简单写一些、还在摸索中... 1.升级iOS11后造成的变化 1. 1升级后,发现某个拥有tableView的界面...
    _VisitorsZsl阅读 7,385评论 15 17
  • 背景 按照往年新系统发布的时间规律,新的系统预计在9月20日左右发布,目前beta版本已经更新到beta6。想必都...
    冬冬吧阅读 15,437评论 17 20
  • 本文转自公众号的一篇文章,放在这里仅供以后查询。https://mp.weixin.qq.com/s?__biz=...
    nickNameDC阅读 471评论 0 0
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,030评论 0 4