如何在SwiftUI中检测targetEnvironment是否是iPadOS?

cyr*_*ril 10 swift5 swiftui

我想在为 iOS 和 iPadOS 构建时显示不同的视图。目前,我知道我可以做到

import SwiftUI

struct ContentView: View {
    #if targetEnvironment(macCatalyst)
    var body: some View {
        Text("Hello")
    }
    #else
    var body: some View {
        Text("Hello")
    }
    #endif
}
Run Code Online (Sandbox Code Playgroud)

在 macOS 和 iPadOS/iOS 之间显示不同的视图(在 Swift 4/5 中引入)。但我如何区分后者?我似乎无法使用 targetEnvironment ...

Mah*_*san 26

我添加以下代码作为 UIDevice 的扩展。

extension UIDevice {
    static var isIPad: Bool {
        UIDevice.current.userInterfaceIdiom == .pad
    }
    
    static var isIPhone: Bool {
        UIDevice.current.userInterfaceIdiom == .phone
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以在任何地方打电话UIDevice.isIPadUIDevice.isIPhone知道它是什么设备。


car*_*ram 13

我在我的代码中使用它:

    private var idiom : UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom }
    private var isPortrait : Bool { UIDevice.current.orientation.isPortrait }
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

    var body: some View {
        NavigationView {
            masterView()

            if isPortrait {
                portraitDetailView()
            } else {
                landscapeDetailView()
            }
        }
    }

    private func portraitDetailView() -> some View {
        if idiom == .pad {
            return Text("iPadOS")
        } else {
            return Text("iOS")
        }
    }
Run Code Online (Sandbox Code Playgroud)


Zon*_*tag 7

要返回不同的视图类型,您可以使用AnyView橡皮擦类型:

if UIDevice.current.userInterfaceIdiom == .pad {
    return AnyView(Text("Hello, World!"))
} else {
    return AnyView(Rectangle().background(Color.green))
}
Run Code Online (Sandbox Code Playgroud)