SwiftUI iOS14以降はLabel、それ以前はImage+Text

iOS13を救うには#availableを書く。
共通化すれば綺麗。
今回の場合はViewが違うので良いが、Modifiersを#availableで囲いたい時がある。

Example

Button(action: {
    self.save()
}, label: {
    if #available(iOS 14.0, *) {
        Label("Save", systemImage: "tray.and.arrow.down")
            .font(.title)
    }
    else {
        HStack {
            Image(systemName: "tray.and.arrow.down")
                .font(.title)
            Text("Save")
                .font(.title)
        }
    }
})

共通化

import SwiftUI

struct ButtonLabel: View {
    let action: () -> Void
    let message: String
    let systemImage: String

    var body: some View {
        Button(action: self.action
               , label: {
            if #available(iOS 14.0, *) {
                Label(NSLocalizedString(self.message, comment: ""),
                      systemImage: self.systemImage)
            }
            else {
                HStack {
                    Image(systemName: self.systemImage)
                    Text(NSLocalizedString(self.message, comment: ""))
                }
            }
        })
    }
}

SwiftSwift,SwiftUI

Posted by shi-n