标签: hstack

SwiftUI:列表、NavigationLink 和徽章

我正在开发我的第一个 SwiftUI 应用程序,并希望在其中显示一个List类别,并用一个徽章指示该类别中的项目数量。类别的标题将位于左侧,徽章将在行中右对齐。该列表将由NavigationLinks 组成,因此点击其中一个将进一步深入到视图层次结构。我编写的用于渲染 s 的代码NavigationLink如下所示:

        List {
            ForEach(myItems.indices) { categoryIndex in
                let category = categories[categoryIndex]
                let title = category.title
                let fetchReq = FetchRequest<MyEntity>(entity: MyEntity(),
                                            animation: .default)
                
                NavigationLink(destination: MyItemView()) {
                    HStack(alignment: .center) {
                        Text(title)
                        Spacer()
                        ZStack {
                            Circle()
                                .foregroundColor(.gray)
                            
                            Text("\(myItemsDict[category]?.count ?? 0)")
                                .foregroundColor(.white)
                                .font(Font.system(size: 12))
                        }
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

虽然它确实呈现了一个功能性的NavigationLink,但徽章并没有像我所希望的那样右对齐显示。相反,它看起来像这样:

在此输入图像描述

我知道我被某些事情所困扰HStack,但不确定是什么。如何才能使类别标题文本占据行的大部分,并且徽章在行中右对齐?

swift swiftui hstack swiftui-navigationlink

3
推荐指数
1
解决办法
594
查看次数

为什么 LazyHStack 在 SwiftUI 中采用全高,而 HStack 不采用全高?

为什么 LazyHStack 在高度方面的行为与 HStack 不同?(VStack 也一样)。

import SwiftUI

struct LazyTestView: View {

   var body: some View {

      LazyHStack {

         ForEach(1...10, id: \.self) { int in
            Text("\(int)")
         }

      }
   }
}

struct LazyTestView_Previews: PreviewProvider {

    static var previews: some View {
        LazyTestView()
            .previewLayout(.sizeThatFits)
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

而使用 HStack 时:

import SwiftUI

struct LazyTestView: View {
   var body: some View {
      HStack {
         ForEach(1...10, id: \.self) { int in
            Text("\(int)")
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

.fixedSize()一种解决方案是为 LazyHStack添加...

PS:Xcode版本12.5测试版(12E5220o)

swiftui vstack hstack

3
推荐指数
1
解决办法
1789
查看次数

SwiftUI-在HStack中并排放置两个选择器不会调整选择器的大小

我的目标是将两个选择器水平并排放置,每个选择器占用屏幕的一半宽度。想象一下UIPickerView,它适合屏幕的宽度,并且具有两个宽度相等的组件-这就是我试图在SwiftUI中重新创建的组件。

由于SwiftUI中的选择器当前不允许使用多个组件,因此对我来说,显而易见的替代方案是将两个选择器放置在内HStack

这是来自测试项目的一些示例代码:

struct ContentView: View {
    @State var selection1: Int = 0
    @State var selection2: Int = 0

    @State var integers: [Int] = [0, 1, 2, 3, 4, 5]

    var body: some View {
        HStack {
            Picker(selection: self.$selection1, label: Text("Numbers")) {
                ForEach(self.integers) { integer in
                    Text("\(integer)")
                }
            }
            Picker(selection: self.$selection2, label: Text("Numbers")) {
                ForEach(self.integers) { integer in
                    Text("\(integer)")
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是画布:

SwiftUI-HStack中的选择器

选择器不会调整为屏幕宽度的一半,就像我期望的那样。它们保留其大小,而是拉伸内容视图的宽度,从而扭曲了流程中其他UI元素的宽度(正如我在其他项目中尝试这样做时所发现的那样)。

我知道我可以用它UIViewRepresentable来获得想要的效果,但是鉴于我要使用它的复杂性,SwiftUI会更容易使用。

是将两个选择器放置在内HStack并不能正确调整它们的大小,还是SwiftUI中的选择器只是具有无法更改的固定宽度?


更新资料

使用GeometryReader …

picker swiftui hstack

2
推荐指数
2
解决办法
825
查看次数

如何在 SwiftUI 上的 VStack 上对齐多个项目的列?

在下面的示例中,如果我有一个VStackfollow 的 a HStack,如何使 follow 的宽度与gridHStack相同?

struct VStackAlignmentView: View {
    let data = ["a", "b", "cdefghl alalala", "i", "j"]
    var body: some View {
        VStack(spacing: 0) {
            ForEach (data, id:\.self) { item in
                HStack(alignment: .top) {
                    Text("Column 1")
                    VStack(alignment: .trailing) {
                        Text("Column \(item)")
                        Text("Value 2")
                    }
                    .frame(minWidth: 120)
                    Text("Column 3")
                    Spacer()
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的结果: 上面代码的结果 第三行的文本右对齐,但其他行添加了一个空格

我尝试过VStack(alignment: .trailing)通过添加一个Text具有框架宽度的空白来解决此问题,并且它有效,但我认为这不是一种优雅的方式。

我也尝试过使用alignmentGuide,但它把观点推向了其他方式。

有人有同样的问题吗?

alignment swiftui vstack hstack

2
推荐指数
1
解决办法
4663
查看次数

在HStack中使两个按钮的高度和宽度相等

我有一个 VStack 和另一个 HStack,里面有按钮。即使我尝试设置按钮的固定宽度和高度,我也遇到了根据按钮内容缩小按钮的问题。

这是主屏幕:

import Foundation
import SwiftUI
import SwiftUINavigator

struct SurveyScreenView: View, IItemView {
    
    var listener: INavigationContainer?
    @State var survey: Survey
    @State var isUp = false
    @State var isDown = false
    
    @State var widthButton: CGFloat = 100
    @State var heightButton: CGFloat = 50
    
    var body: some View {
        NavigationView {
            VStack(alignment: .leading, spacing: 32) {
                Text(survey.title)
                    .font(.title)
                Text(survey.description)
                
                VoteView( survey: $survey, isUp: $isUp, isDown: $isDown)
                
                Spacer()
            }
            .navigationBarItems(leading:
                Button(action: {
                    listener?.pop()
                }, label: {
                    Text("Feed")
                })
            )
            .navigationBarTitle(Text("Survey")) …
Run Code Online (Sandbox Code Playgroud)

swift swiftui vstack hstack

2
推荐指数
1
解决办法
2503
查看次数

SwiftUI 网格布局

我正在尝试使用 SwiftUI 实现以下网格布局,但不太确定最佳方法。

在此处输入图片说明

我的代码在下面,它并没有完全得到我想要的东西,而且有很多嵌套堆栈似乎也很糟糕

VStack {
            
            VStack {
                
                HStack {
                    
                    VStack {
                        
                        Text("Text Here")
                        Text("336.851")
                        
                    }
                    .padding(20)
                    .background(ColorManager.orange)
                    .cornerRadius(10)
                    
                    VStack {
                        
                        Text("Text Here")
                        Text("336.851")
                        
                    }
                    .padding(20)
                    .background(ColorManager.red)
                    .cornerRadius(10)
                    
                }
                
                HStack {
                    
                    VStack {
                        
                        Text("Text Here")
                        Text("336.851")
                        
                    }
                    .padding(20)
                    .background(ColorManager.green)
                    .cornerRadius(10)
                    
                    VStack {

                        Text("Text Here")
                        Text("336.851")

                    }
                    .padding(20)
                    .background(ColorManager.blue)
                    .cornerRadius(10)

                    VStack {

                        Text("Text Here")
                        Text("336.851")

                    }
                    .padding(20)
                    .background(ColorManager.purpleLight)
                    .cornerRadius(10)
                    
                }
                
                
            }
            
        }
Run Code Online (Sandbox Code Playgroud)

我的代码给出了以下结果,我只是不确定如何将框最大化跨越屏幕的一半和三分之一。另外,我对嵌套堆栈采取的方法是否正确?

在此处输入图片说明

swift swiftui vstack hstack

1
推荐指数
1
解决办法
788
查看次数

当 HStack 中存在不同大小的文本时,顶部对齐不适用于较大大小的文本

我有一个包含多个元素的 HStack,特别是两个Text具有不同字体大小的 s。我希望两个文本都与视图顶部对齐。

\n
HStack(alignment: .top) {\n    Image(systemName: "cloud.drizzle.fill")\n    Text("14\xc2\xb0")\n        .font(.largeTitle)\n    Text("86%")\n        .font(.callout)\n    Spacer()\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,第一个(较大的)Text输出在其他两个下方:

\n

在此输入图像描述

\n

text alignment ios swiftui hstack

1
推荐指数
1
解决办法
289
查看次数