Sponsoring
Contents
UINavigationBarAppearanceの初期設定後の変更が反映されない現象の対応
先日iOSアプリ開発で、UINavigationBarの文字や背景色をScrollViewのcontentOffsetに合わせて変更する機能を実装したのですが、iOS/iPadOS14以下でその変更が反映されない現象に遭遇したので、その対応を備忘録としてまとめます。
UINavigationBarAppearanceの初期設定後も、設定の変更を反映させる方法
iOS/iPadOS14以下でも再設定を適用する方法は、結論からいうと、設定を初期化を行うことです。 もともとの実装の例は以下のようなコードです
func setupNavitaionBar(alpha: CGFloat) { // <- T value `alpha` is depending on scrollView's contentOffset.y value
guard let navigationBar = navigationController?.navigationBar else { return }
let backgroundColor = UIColor.white.withAlphaComponent(alpha)
let titleColor = UIColor.black.withAlphaComponent(alpha)
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = backgroundColor
appearance.titleTextAttributes = [.foregroundColor: titleColor]
navigationBar.standardAppearance = appearance
}
上記のコードはalphaの値に合わせて、navigationBarの文字と背景色の透過度が変化するので、 setupNavitaionBar
を呼ぶたびに、navigationBarのUIがalphaの値に応じて変化します。
しかし上記のコードでは、iOS/iPadOS14以下の端末では、最初の1回のみ設定が適用され、2回目以降の実行分は上手く適用されません。 そこで以下のように修正します。
func setupNavitaionBar(alpha: CGFloat) { // <- T value `alpha` is depending on scrollView's contentOffset.y value
guard let navigationBar = navigationController?.navigationBar else { return }
let backgroundColor = UIColor.white.withAlphaComponent(alpha)
let titleColor = UIColor.black.withAlphaComponent(alpha)
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = backgroundColor
appearance.titleTextAttributes = [.foregroundColor: titleColor]
// Add codes to reset navigationBar appearance config.
if #available(iOS 15.0, *) {
} else {
navigationBar.standardAppearance.configureWithDefaultBackground()
}
navigationBar.standardAppearance = appearance
}
上記のように、configureWithDefaultBackground
を呼び、設定を初期化することで、2回目以降の設定変更も反映されるようになります(理由までは把握できていないです。。)
+1
Sponsoring