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

h43kikqp  于 2023-05-16  发布在  Swift
关注(0)|答案(5)|浏览(281)

我想将图像框调整为与iPhone屏幕宽度相同的正方形,因此高度值(屏幕宽度)也相同。
下面的代码不起作用,因为它使图像具有与视图相同的高度。

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

nhaq1z211#

您可以创建一个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
}

用法

UIScreen.screenWidth
ie3xauqp

ie3xauqp2#

尝试使用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()
        }
    }
}

kqqjbcuj

kqqjbcuj3#

您可以使用UISscreen.main.bounds**.width.height**

.frame(
   width:UIScreen.main.bounds.width,
   height:UIScreen.main.bounds.height
)
bn31dyow

bn31dyow4#

我提出了一个使用环境密钥的解决方案,通过创建以下内容:

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

extension EnvironmentValues {
    var mainWindowSize: CGSize {
        get { self[MainWindowSizeKey.self] }
        set { self[MainWindowSizeKey.self] = newValue }
    }
}

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

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

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

@Environment(\.mainWindowSize) var mainWindowSize
wr98u20j

wr98u20j5#

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

var body: some View {
    Image("someImage")
       .resizable()
       .aspectRatio(1.0, contentMode: .fit)
}

相关问题