iOS15適配記錄篇

本文作為自己準(zhǔn)備適配iOS15所用,在開始適配之前设江,先去學(xué)習(xí)各位同學(xué)的文章锦茁,記錄在此備用。

1叉存、導(dǎo)航欄UINavigationBar

從 iOS 15 開始码俩,UINavigationBar、UIToolbar 和 UITabBar 在控制器中關(guān)聯(lián)滾動(dòng)視圖頂部或底部時(shí)使用
在iOS15中歼捏,UINavigationBar默認(rèn)是透明的稿存,有滑動(dòng)時(shí)會(huì)逐漸變?yōu)槟:Ч颗瘢梢酝ㄟ^改變UINavigationBar.scrollEdgeAppearance屬性直接變?yōu)槟:Ч⑴渲孟嚓P(guān)屬性-背景瓣履、字體等

if #available(iOS 15.0, *) { //UINavigationBarAppearance屬性從iOS13開始
      let navBarAppearance = UINavigationBarAppearance()
      // 背景色
      navBarAppearance.backgroundColor = UIColor.clear
      // 去掉半透明效果
      navBarAppearance.backgroundEffect = nil
      // 去除導(dǎo)航欄陰影(如果不設(shè)置clear率翅,導(dǎo)航欄底下會(huì)有一條陰影線)
      navBarAppearance.shadowColor = UIColor.clear
      // 字體顏色
      navBarAppearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
      self.navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance
}

用新xcode13編譯工程后,導(dǎo)航欄的問題比較明顯袖迎,調(diào)試之后發(fā)現(xiàn)是UINavigationBar部分屬性的設(shè)置在iOS15上是無效的

  • 舊代碼
navigationBar.setBackgroundImage(UIColor.clear.image, for: .default)
// 導(dǎo)航欄背景冕臭,主題色是綠色
navigationBar.barTintColor = UIColor.theme
// 默認(rèn)不透明
navigationBar.isTranslucent = false
// 著色,讓返回按鈕圖片渲染為白色
navigationBar.tintColor = UIColor.white
// 導(dǎo)航欄文字
navigationBar.titleTextAttributes = [
     NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18),
     NSAttributedString.Key.foregroundColor: UIColor.white
]

run起來后發(fā)現(xiàn)燕锥,導(dǎo)航欄顏色設(shè)置沒有作用辜贵,呈現(xiàn)是白色,字體顏色也沒有生效归形,呈現(xiàn)黑色托慨,查看導(dǎo)航欄特性API:UINavigationBarAppearance后發(fā)現(xiàn),iOS15navigationBar的相關(guān)屬性設(shè)置要通過實(shí)例UINavigationBarAppearance來實(shí)現(xiàn)暇榴,UINavigationBarAppearance是iOS13更新的API厚棵,應(yīng)該有人已經(jīng)在用,我們的應(yīng)用兼容iOS10以上蔼紧,對(duì)于導(dǎo)航欄的設(shè)置還沒有使用UINavigationBarAppearance婆硬,如今在iOS15上失效,所以對(duì)于呈現(xiàn)的問題歉井,做如下適配:

  • 新代碼
if #available(iOS 15, *) {
    let app = UINavigationBarAppearance.init()
    app.configureWithOpaqueBackground()  // 重置背景和陰影顏色
    app.titleTextAttributes = [
        NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18),
        NSAttributedString.Key.foregroundColor: UIColor.white
    ]
    app.backgroundColor = UIColor.theme  // 設(shè)置導(dǎo)航欄背景色
    app.shadowImage = UIColor.clear.image  // 設(shè)置導(dǎo)航欄下邊界分割線透明
    navigationBar.scrollEdgeAppearance = app  // 帶scroll滑動(dòng)的頁面
    navigationBar.standardAppearance = app // 常規(guī)頁面柿祈。描述導(dǎo)航欄以標(biāo)準(zhǔn)高度顯示時(shí)要使用的外觀屬性。
}

關(guān)于navigationBar背景圖片失效的問題:
老代碼:

navigationBar.setBackgroundImage(img, for: .default)

iOS15代碼:

appearance.backgroundImage = img;
appearance.backgroundImageContentMode = UIViewContentModeScaleToFill;
navigationBar.standardAppearance = appearance;

tabbar跟navigationBar同理設(shè)置即可哩至。

2躏嚎、TableView

從 iOS 15 開始,TableView 增加sectionHeaderTopPadding屬性菩貌,默認(rèn)情況sectionHeaderTopPadding會(huì)有22個(gè)像素的高度卢佣,及默認(rèn)情況,TableView section header增加22像素的高度

/// Padding above each section header. The default value is `UITableViewAutomaticDimension`.
    @available(iOS 15.0, *)
    open var sectionHeaderTopPadding: CGFloat
if #available(iOS 15.0, *) {
      self.tableView.sectionHeaderTopPadding = 0
}

3箭阶、Image

在iOS15中虚茶,UIImageWriteToSavedPhotosAlbum存儲(chǔ)圖片之后的回調(diào)不再返回圖片了,會(huì)返回nil仇参,如果在回調(diào)方法里面操作image有可能會(huì)直接Crash嘹叫,目前的解決辦法聲明一個(gè)全局image去記錄,后面再去操作

self.image = image;
UIImageWriteToSavedPhotosAlbum(image,self,@selector(image:didFinishSavingWithError:contextInfo:), NULL);
            
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    // self.image doing...
}

4诈乒、UITabbar

tabbar的問題和navigationBar的問題屬于同一類罩扇,tabbar背景顏色設(shè)置失效,字體設(shè)置失效,陰影設(shè)置失效問題

  • 舊代碼
self.tabBar.backgroundImage = UIColor.white.image
self.tabBar.shadowImage = UIColor.init(0xEEEEEE).image
item.setTitleTextAttributes(norTitleAttr, for: .normal)
item.setTitleTextAttributes(selTitleAttr, for: .selected)

首先是背景色設(shè)置失效喂饥,讓我就想到了navigationbar的問題消约,所以沒有查api了
直接用UITabBarAppearance來設(shè)置,

  • 新代碼
if #available(iOS 15, *) {
    let bar = UITabBarAppearance.init()
    bar.backgroundColor = UIColor.white
    bar.shadowImage = UIColor.init(0xEEEEEE).image
    let selTitleAttr = [
        NSAttributedString.Key.font: itemFont,
        NSAttributedString.Key.foregroundColor: UIColor.theme
    ]
    bar.stackedLayoutAppearance.selected.titleTextAttributes = selTitleAttr // 設(shè)置選中attributes
    self.tabBar.scrollEdgeAppearance = bar
    self.tabBar.standardAppearance = bar//與navi同理
}

5员帮、對(duì)狀態(tài)編程的支持:UICellConfigurationState或粮;UICollectionViewCell、UITableViewCell都支持狀態(tài)變化時(shí)的block執(zhí)行了捞高。
6氯材、UICollectionViewLayout支持自動(dòng)高度;AutomaticDimension
7硝岗、json解析支持json5了
8浓体、增加UISheetPresentationController,通過它可以控制 Modal 出來的 UIViewController 的顯示大小辈讶,且可以通過拖拽手勢(shì)在不同大小之間進(jìn)行切換。只需要在跳轉(zhuǎn)的目標(biāo) UIViewController 做如下處理:

if let presentationController = presentationController as? UISheetPresentationController {
   // 顯示時(shí)支持的尺寸
   presentationController.detents = [.medium(), .large()]
   // 顯示一個(gè)指示器表示可以拖拽調(diào)整大小
   presentationController.prefersGrabberVisible = true
}

9娄猫、UIButton支持更多配置贱除。UIButton.Configuration是一個(gè)新的結(jié)構(gòu)體,它指定按鈕及其內(nèi)容的外觀和行為媳溺。它有許多與按鈕外觀和內(nèi)容相關(guān)的屬性月幌,如cornerStyle、baseForegroundColor悬蔽、baseBackgroundColor扯躺、buttonSize、title蝎困、image录语、subtitle、titlePadding禾乘、imagePadding澎埠、contentInsets、imagePlacement等始藕。

// Plain
let plain = UIButton(configuration: .plain(), primaryAction: nil)
plain.setTitle("Plain", for: .normal)
// Gray
let gray = UIButton(configuration: .gray(), primaryAction: nil)
gray.setTitle("Gray", for: .normal)
// Tinted
let tinted = UIButton(configuration: .tinted(), primaryAction: nil)
tinted.setTitle("Tinted", for: .normal)
// Filled
let filled = UIButton(configuration: .filled(), primaryAction: nil)
filled.setTitle("Filled", for: .normal) 
image

10蒲稳、推出CLLocationButton用于一次性定位授權(quán),該內(nèi)容內(nèi)置于CoreLocationUI模塊伍派,但如果需要獲取定位的詳細(xì)信息仍然需要借助于CoreLocation江耀。

let locationButton = CLLocationButton()
// 文字
locationButton.label = .currentLocation
locationButton.fontSize = 20
// 圖標(biāo)
locationButton.icon = .arrowFilled
// 圓角
locationButton.cornerRadius = 10
// tint
locationButton.tintColor = UIColor.systemPink
// 背景色
locationButton.backgroundColor = UIColor.systemGreen
// 點(diǎn)擊事件,應(yīng)該在在其中發(fā)起定位請(qǐng)求
locationButton.addTarget(self, action: #selector(getCurrentLocation), for: .touchUpInside)

11诉植、URLSession 推出支持 async/await 的 API祥国,包括獲取數(shù)據(jù)、上傳與下載倍踪。

// 加載數(shù)據(jù)
let (data, response) = try await URLSession.shared.data(from: url)
// 下載
let (localURL, _) = try await session.download(from: url)
// 上傳
let (_, response) = try await session.upload(for: request, from: data)

12系宫、系統(tǒng)圖片支持多個(gè)層索昂,支持多種渲染模式。

// hierarchicalColor:多層渲染扩借,透明度不同
let config = UIImage.SymbolConfiguration(hierarchicalColor: .systemRed)
let image = UIImage(systemName: "square.stack.3d.down.right.fill", withConfiguration: config)
// paletteColors:多層渲染椒惨,設(shè)置不同風(fēng)格
let config2 = UIImage.SymbolConfiguration(paletteColors: [.systemRed, .systemGreen, .systemBlue])
let image2 = UIImage(systemName: "person.3.sequence.fill", withConfiguration: config2)

13、UIImage 新增了幾個(gè)調(diào)整尺寸的方法潮罪。

// preparingThumbnail
UIImage(named: "sv.png")?.preparingThumbnail(of: CGSize(width: 200, height: 100))
// prepareThumbnail康谆,閉包中直接獲取調(diào)整后的UIImage
UIImage(named: "sv.png")?.prepareThumbnail(of: CGSize(width: 200, height: 100)) { image in
    // 需要回到主線程更新UI
}
// byPreparingThumbnail
await UIImage(named: "sv.png")?.byPreparingThumbnail(ofSize: CGSize(width: 100, height: 100))

比較實(shí)用的9,13嫉到,之前都是封裝了好多代碼沃暗,現(xiàn)在一句話搞定

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市何恶,隨后出現(xiàn)的幾起案子孽锥,更是在濱河造成了極大的恐慌,老刑警劉巖细层,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惜辑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疫赎,警方通過查閱死者的電腦和手機(jī)盛撑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捧搞,“玉大人抵卫,你說我怎么就攤上這事√テ玻” “怎么了介粘?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)创坞。 經(jīng)常有香客問我碗短,道長(zhǎng),這世上最難降的妖魔是什么题涨? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任偎谁,我火速辦了婚禮,結(jié)果婚禮上纲堵,老公的妹妹穿的比我還像新娘巡雨。我一直安慰自己,他們只是感情好席函,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布铐望。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪正蛙。 梳的紋絲不亂的頭發(fā)上督弓,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音乒验,去河邊找鬼愚隧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锻全,可吹牛的內(nèi)容都是我干的狂塘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼鳄厌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼荞胡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起了嚎,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤泪漂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后歪泳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窖梁,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年夹囚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邀窃。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荸哟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞬捕,到底是詐尸還是另有隱情鞍历,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布肪虎,位于F島的核電站劣砍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扇救。R本人自食惡果不足惜刑枝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迅腔。 院中可真熱鬧装畅,春花似錦、人聲如沸沧烈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚂夕,卻和暖如春迅诬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背婿牍。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工侈贷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牍汹。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓铐维,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親慎菲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫁蛇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容