根据设备更改视图 - SwiftUI

问题描述 投票:0回答:3

我最初是为 iPad 设计的应用程序,现在也想为 iPhone 添加功能。有没有办法检查正在使用的设备是什么,然后相应地显示视图?

结构化英语:

IF current_device == iPhone THEN
    DISPLAY iPhoneView
ELSE IF current_device == iPad THEN
    DISPLAY iPadView

如果可能的话,我还希望 iPad 视图仅水平可用,然后 iPhone 视图仅在可能的情况下垂直可用。

ios swift responsive-design swiftui responsive
3个回答
10
投票

您正在寻找的是尺码类别

要在 SwiftUI 视图中读取当前水平尺寸类别,您可以参考

horizontalSizeClass

的环境值
@Environment(\.horizontalSizeClass) var horizontalSizeClass

然后在你的 SwiftUI 中像这样使用它

View
:

var body: some View {
    if horizontalSizeClass == .compact {
        return CompactView() // view laid out for smaller screens, like an iPhone
    } else {
        return RegularView() // view laid out for wide screens, like an iPad
    }
}

值得注意的是,并非所有 iPhone 都是

compact
水平放置的,在多任务配置下,iPad 上也存在
compact
尺寸类别。您将在此处设备尺寸类别多任务尺寸类别部分找到所有可能的组合。

一些可能有帮助的文章


1
投票

或者,您可以使用如下变量根据设备高度(或宽度)设置单独的阈值:

@State var isLargeDevice: Bool = {
    if UIScreen.main.bounds.height > 800 {
        return true
    } else {
        return false
    }
}()

0
投票

我喜欢@Malburrito 的答案,但需要合并Mac。

#if os(iOS)
import UIKit
#endif

var isLargeDevice: Bool {
#if os(macOS)
    return true
#else
    if UIScreen.main.bounds.width > 1200 {
        return true
    } else {
        return false
    }
#endif
}

并像这样使用它:

struct MainView: View {
    var body: some View {
        if isLargeDevice {
            RegularMainView() // uses NavigationSplitView
        } else {
            CompactMainView() // uses NavigationStack
        }
    }
}

我可能需要添加更多内容来区分纵向或横向模式,但当我到达那里时会跨过那座桥。

© www.soinside.com 2019 - 2024. All rights reserved.