如何在 SwiftUI 中检测 targetEnvironment 是不是为 iPadOS?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中检测 targetEnvironment 是不是为 iPadOS?【英文标题】:How to detect whether targetEnvironment is iPadOS in SwiftUI?如何在 SwiftUI 中检测 targetEnvironment 是否为 iPadOS? 【发布时间】:2019-12-30 07:27:22 【问题描述】:

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

import SwiftUI

struct ContentView: View 
    #if targetEnvironment(macCatalyst)
    var body: some View 
        Text("Hello")
    
    #else
    var body: some View 
        Text("Hello")
    
    #endif

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

【问题讨论】:

【参考方案1】:

我在我的代码中使用了这个:

    private var idiom : UIUserInterfaceIdiom  UIDevice.current.userInterfaceIdiom 
    private var isPortrait : Bool  UIDevice.current.orientation.isPortrait 

那么你可以这样做:

    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")
        
    

【讨论】:

【参考方案2】:

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

if UIDevice.current.userInterfaceIdiom == .pad 
    return AnyView(Text("Hello, World!"))
 else 
    return AnyView(Rectangle().background(Color.green))

【讨论】:

【参考方案3】:

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

extension UIDevice 
    static var isIPad: Bool 
        UIDevice.current.userInterfaceIdiom == .pad
    
    
    static var isIPhone: Bool 
        UIDevice.current.userInterfaceIdiom == .phone
    

现在我可以在任何地方致电UIDevice.isIPadUIDevice.isIPhone 了解它是哪个设备。

【讨论】:

以上是关于如何在 SwiftUI 中检测 targetEnvironment 是不是为 iPadOS?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 macOS 上检测 SwiftUI 中的键盘事件?

如何在 macOS 上检测 SwiftUI 中的键盘事件?

如何检测模态视图在 SwiftUI 中全局可见

如何在 SwiftUI 中检测 targetEnvironment 是不是为 iPadOS?

如何在 SwiftUI 中检测 TextField 的实时变化?

如何在 iOS 应用程序中以编程方式检测 SwiftUI 的使用情况