iOS

UINavigationBarAppearanceの初期設定後の変更が反映されない現象の対応

swift-uinavigationbarbppearance-reset

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

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA