SwiftUI 如何调整不同的屏幕尺寸

Posted

技术标签:

【中文标题】SwiftUI 如何调整不同的屏幕尺寸【英文标题】:SwiftUI how to adjust different screen sizes 【发布时间】:2019-11-28 00:15:42 【问题描述】:

我正在使用 SwiftUI 开发人员列表页面,iPhone X 屏幕足够大,但在 iPhone 8 中标题超出了屏幕:

iPhone X:

但在 iPhone 8 或更小的屏幕中,“查找人员”离左侧太近,“全部关注”甚至超出屏幕范围:

我知道在 UIKit 中自动布局会很容易地解决这个问题,但我想知道 SwiftUI 解决这个问题的最佳方法或正确方法是什么,一些答案说使用 SpacerHStack,但它们都没有真正起作用。

var body: some View 
    NavigationView 
        List 
            ForEach(people) person in
                PersonView(person: person)
            
        .navigationBarItems(leading:
            VStack(spacing: 10) 
                HStack(spacing: 100) 
                    Text("Find People").font(.system(size: 30)).bold()
                    Text("Follow All").foregroundColor(Color(ColorUtils.hexStringToUIColor(hex: Constants.THEME.THEME_COLOR)))
                
                HStack(spacing: 20) 
                     Text("Import from: ")
                     ForEach(socialIcons, id: \.self) icon in
                         Image(icon).resizable().frame(width: 25, height: 25)
                     
                
            
        )
    

【问题讨论】:

我认为问题在于您有效地指定了一个需要尾随的项目(“全部关注”)文本作为leading 视图的一部分,因为您想要社交项目下一行。如果我删除了各种堆栈和社交图标,并且只有两个文本项,前导和尾随,就可以了 您可能需要重新设计布局。 “找人”应该是.navigationBarTitle,将社交导入和关注全部作为NavigationView 内容的一部分。 【参考方案1】:

您正在放置静态间距,以便发生问题。您可以使用Spacer() 修饰符修复它并提供一些Frame()

var body: some View 
    NavigationView 
        List 
            ForEach(peoples, id: \.self) person in
                PersonView(person: person)
            
        .navigationBarItems(leading:
            VStack(spacing: 5)  // Change Spacing as you want
                HStack 
                    Text("Find People").font(.system(size: 30)).bold()
                    Spacer()
                    Text("Follow All").foregroundColor(Color(ColorUtils.hexStringToUIColor(hex: Constants.THEME.THEME_COLOR)))
                
                HStack() 
                    Text("Import from:")
                    Spacer()
                    ForEach(socialIcons, id: \.self) icon in
                        Image(icon).resizable().frame(width: 25, height: 25)
                            .padding(.horizontal)
                    
                
            .frame(width: UIScreen.main.bounds.width-20, alignment: .center)
        )
    

【讨论】:

【参考方案2】:

不要硬编码间距,而是使用动态工具,例如 Spacer() 和 .padding。请参阅下面修改您的代码作为示例。希望对您有所帮助。

HStack 
    Text("Find People").font(.system(size: 30)).bold()
    Spacer()
    Text("Follow All").foregroundColor(Color(ColorUtils.hexStringToUIColor(hex: Constants.THEME.THEME_COLOR)))

HStack 
     Text("Import from: ")
     Spacer()
     ForEach(socialIcons, id: \.self) icon in
         Image(icon).resizable().frame(width: 25, height: 25)
            .padding(.horizontal)
     

【讨论】:

【参考方案3】:

我为比例尺寸创建了一个有用的视图扩展,它将使用屏幕尺寸的百分比作为参数来计算尺寸,并根据屏幕尺寸返回尺寸

extension View 
      func propotionalFrame(width: CGFloat, height: CGFloat, isSquared: Bool = false, alignment: Alignment = .center) -> some View 
        let finalWidth = UIScreen.main.bounds.width * width
        let finalHeight = isSquared ? finalWidth : UIScreen.main.bounds.height * height
        return frame(width: finalWidth, height: finalHeight)
      
    

usage:

Image(systemName: "person.circle.fill")
      .resizable()
      .propotionalFrame(width: 0.3, height: 0.2)

【讨论】:

以上是关于SwiftUI 如何调整不同的屏幕尺寸的主要内容,如果未能解决你的问题,请参考以下文章

如何适应不同的屏幕尺寸

调整按钮以适应不同的屏幕尺寸

如何使用 Xcode 8 上的自动布局调整对象的大小以适应不同的屏幕尺寸?

如何调整html中的图像大小以适应屏幕尺寸?

在 Xcode 中将图像尺寸调整为不同的 iPhone 屏幕尺寸

如何使用情节提要为不同的 iPhone 屏幕尺寸设置不同的字体尺寸?