【问题标题】:How to get the iPhone's screen width in SwiftUI?如何在 SwiftUI 中获取 iPhone 的屏幕宽度?
【发布时间】:2020-01-03 17:30:54
【问题描述】:

我想将图像框架的大小调整为与 iPhone 屏幕宽度相同的正方形,因此高度值(屏幕宽度)也相同。

以下代码不起作用,因为它使图像具有相同的视图高度。

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

【问题讨论】:

  • 听起来您遇到了不同的问题,因为您正在使用Image。 (是的,有两种相当简单的方法可以获得屏幕宽度,但我认为它们不会解决您的问题。)您是否尝试过添加此修饰符? .aspectRatio(contentMode: .fit)
  • 第二条评论...我赞成@DoesData 的答案,因为这是一对二的SwiftUI 这样做的方式(并且没有反对@MehmetAliVataniar 的答案,尽管它使一些严重的非-SwiftUI 假设。第二种方式 - 在以下问题中找到,使用子类化 UIHostingController 并可能让您很多您可以做更多的事情:stackoverflow.com/questions/57441654/…

标签: ios swift iphone swiftui


【解决方案1】:

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

【讨论】:

  • GeometryReader 是必经之路!会根据方向变化等系统事件更新
  • 这需要 UIKit,所以不再为 Mac 构建 SwiftUI。
  • 感谢您。希望很快会有一个 swiftui 本机代码。但这适用于我需要的东西,因为我已经嵌套在另一个视图中,所以 Geometry Reader 不适合我。我无法获得全局宽度和高度。
  • .sizeUIScreen.main.bounds 上不是必需的,因此您可以直接使用UIScreen.main.bounds.width/height,省去一步,使无异常的原始调用更加可行。
  • @Jeehut:自 iOS 2.0 起已弃用
【解决方案2】:

尝试使用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.height, alignment: .center)
            // .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
            .clipped()
        }
    }
}

【讨论】:

  • 我测试了代码,但至少在我的预览中,图像仍然是屏幕大小而不是正方形。
  • @RubensNeto - 我不确定预览,因为我没有运行 OSX Catalina,但在模拟器/设备上运行此代码会产生上述宽度/高度相等的输出。我希望这会有所帮助。
  • GeometryReader 的问题在于它只适用于您所处的级别。如果您尝试编写通用模式弹出窗口并希望隐藏弹出窗口下方的屏幕,GeometryReader 不会为您提供任何信息来执行此操作。正确地做到这一点需要大量的代码。
  • @P.Ent 你看过GeometryProxy吗? “访问容器视图的大小和坐标空间(用于锚分辨率)的代理。”
  • 请注意,这个答案有一个错字......高度应该是geometry.size.height(不是宽度)
【解决方案3】:

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

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

【讨论】:

  • GeometryReader 是必经之路!会根据方向变化等系统事件更新
  • @Sajjon GeometryReader 还会破坏您的屏幕并导致内容不必要地扩展,从而导致更多头痛。
  • 这是了解硬件屏幕尺寸的特定方法,如问题中所述。更重要的是,如果您需要获取硬件屏幕 height,那么 GeometryReader 会失败 - 它会减去屏幕顶部的状态栏!而且,谢天谢地,let hardwareScreenSize = UIScreen.main.bounds.size 在 SwiftUI 中运行良好。
  • @Justacoder 您可以将 GeometryReader 包装在 .background() 中或将其隐藏在 ZStack 中以避免布局问题
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 1970-01-01
    • 2017-10-01
    • 2012-06-02
    • 2020-04-24
    • 2011-09-25
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多