Open8

iOS 15 に対応する (Xcode 13.0)

ビルドが通らない

Xcode 12 でも時々起こる。必要なインポート文を追加する。

iOS 15 でUIKit がscrollEdgeAppearance の利用を拡張するようになったとのこと。
standardAppearancescrollEdgeAppearance を与えるようにする。

- navigationController?.navigationBar.barTintColor = .white
if #available(iOS 15.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = .white
    navigationController?.navigationBar.standardAppearance = appearance
    navigationController?.navigationBar.scrollEdgeAppearance = appearance
} else {
    navigationController?.navigationBar.barTintColor = .white
}

参考

barTintColor not working in iOS 15 | Apple Developer Forums

image didFinishSavingWithError のimage がnil になる

挙動が変わったのか、バグなのか不明。

@objc func image(_ image: UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutableRawPointer) {
    print(image == nil) // => true when iOS 15
    yourFunc(image: image, error: error)
}

image を自分で事前に保持することで対処する。

    if #available(iOS 15.0, *) {
        self.image = image
    }
   // 
}

@objc func image(_ image: UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutableRawPointer) {
    // 暫定対処
    if #available(iOS 15.0, *) {
        yourFunc(image: nil, error: error) // should handle self.image
    } else {
        yourFunc(image: image, error: error)
    }
}    

参考

iOS 15 だとUI の表示が崩れてしまった。

Menu {
    Button("Cancel", action: didTapGoBackCancelButton)
} label: {
    Image(systemName: "chevron.left")
        .resizable()
        .scaledToFit()
        .imageScale(.large)
        .padding()
}

ZStack に入れてレイアウトを調整することで意図通りの表示になった。

Menu {
    Button("Cancel", action: didTapGoBackCancelButton)
} label: {
    ZStack {
        Image(systemName: "chevron.left")
            .resizable()
            .scaledToFit()
            .imageScale(.large)
    }
    .padding(.leading, 16)
}

タブバーの外観がおかしい

ナビゲーションバーと同様の対応をする。

if #available(iOS 15.0, *) {
    guard let tabBarController = tabBarController else { return }
    let appearance = UITabBarAppearance()
    appearance.backgroundColor =  UIColor.white
    tabBarController.tabBar.standardAppearance = appearance
    tabBarController.tabBar.scrollEdgeAppearance = appearance
}

Text 要素でlocalizable string のキー名が表示されてしまう

"yourKey" = "";

このように翻訳のキーを指定すると、UI にyourKey という文字列が表示されてしまう。
空文字でないスペース文字を値に与えることで、文字列が描画されないようにできた。

"yourKey" = " ";

アニメーションが崩れる

opacity のみのアニメーションを実装したが、iOS 15 だと謎のレイアウトアニメーションが加わってしまう。(iOS 15 以外でも再現するかも)
DispatchQueue.main.async を記述したところ、意図通りにopacity のみのアニメーションが描画されるようになった。

@State private var yourOpacity = Double(1)
       .onAppear() {
+         DispatchQueue.main.async {
             withAnimation(.easeInOut(duration: 1.0).delay(1.5)) {
                 yourOpacity = 0
             }
+         }           
ログインするとコメントできます