如何在SwiftUI中获取屏幕宽度?

Rub*_*eto 4 swift swiftui

我想将“图像”帧的大小调整为一个正方形,该正方形采用的屏幕宽度相同,因此高度的值(屏幕宽度)相同。

以下代码无效,因为它为图像提供了相同的视图高度。

var body: some View {
        Image("someImage")
            .resizable()
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
            .clipped()
    }
Run Code Online (Sandbox Code Playgroud)

bes*_*per 49

您可以为其创建UIScreen扩展。喜欢:

extension UIScreen{
   static let screenWidth = UIScreen.main.bounds.size.width
   static let screenHeight = UIScreen.main.bounds.size.height
   static let screenSize = UIScreen.main.bounds.size
}
Run Code Online (Sandbox Code Playgroud)

用法

UIScreen.screenWidth
Run Code Online (Sandbox Code Playgroud)

  • GeometryReader 是您的最佳选择!它将根据系统事件(例如方向变化)进行更新 (11认同)
  • “UIScreen.main.bounds”上不需要“.size”,因此您可以直接使用“UIScreen.main.bounds.width/height”,从而消除一个步骤并使原始调用毫无例外地更加可行。 (2认同)

小智 24

我通过创建以下内容提出了使用环境键的解决方案:

private struct MainWindowSizeKey: EnvironmentKey {
    static let defaultValue: CGSize = .zero
}

extension EnvironmentValues {
    var mainWindowSize: CGSize {
        get { self[MainWindowSizeKey.self] }
        set { self[MainWindowSizeKey.self] = newValue }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后通过读取创建窗口的位置的大小:

var body: some Scene {
    WindowGroup {
        GeometryReader { proxy in
            ContentView()
                .environment(\.mainWindowSize, proxy.size)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我可以直接获取任何 SwiftUI 视图中的窗口大小,并且它会动态变化(在 macOS 上的设备旋转或窗口大小调整时):

@Environment(\.mainWindowSize) var mainWindowSize
Run Code Online (Sandbox Code Playgroud)


Meh*_*lar 13

您可以使用 UIScreen.main.bounds .width.height

.frame(
   width:UIScreen.main.bounds.width,
   height:UIScreen.main.bounds.height
)
Run Code Online (Sandbox Code Playgroud)

  • @Sajjon GeometryReader 还会破坏您的屏幕并导致不必要的扩展,从而导致更多麻烦。 (7认同)
  • GeometryReader 是您的最佳选择!它将根据系统事件(例如方向变化)进行更新 (2认同)
  • 这是了解问题中指定的硬件屏幕尺寸的特定方法。更重要的是,如果您需要获取硬件屏幕_高度_,那么 GeometryReader 将会失败——它会减去屏幕顶部的状态栏!值得庆幸的是,“let hardwareScreenSize = UIScreen.main.bounds.size”在 SwiftUI 中工作得很好。 (2认同)

Doe*_*ata 6

尝试使用Geometry Reader

let placeholder = UIImage(systemName: "photo")! // SF Symbols

struct ContentView: View {
    var body: some View {
        GeometryReader { geometry in
            Image(uiImage: placeholder) 
            .resizable()
            .frame(width: geometry.size.width, height: geometry.size.width, alignment: .center)
            // .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
            .clipped()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • GeometryReader 的问题在于它仅适用于您所在的级别。如果您尝试编写通用模式弹出窗口并希望遮盖弹出窗口下方的屏幕,GeometryReader 将不会为您提供任何信息来执行此操作。要正确地做到这一点需要大量代码。 (2认同)
  • 请注意,这个答案中有一个错字......高度应该是geometry.size.height(而不是宽度) (2认同)

LuL*_*aGa 5

最简单的方法是调整图像大小并将纵横比设置为 1.0:

var body: some View {
    Image("someImage")
       .resizable()
       .aspectRatio(1.0, contentMode: .fit)
}
Run Code Online (Sandbox Code Playgroud)