当前位置: 首页 > 知识库问答 >
问题:

SwiftUI:在scrollView中从底部对齐构建视图

丌官和泰
2023-03-14

有没有一种方法可以用底部对齐的方式在SwiftUI中构建滚动视图内的UI元素?

我的用例:我有一个屏幕,屏幕有

  1. 间隔(分配下面元素后剩下的部分)
  2. logoview
  3. 间隔()-30
  4. 某些文本-4/5行
  5. 间隔()-50(这将根据GR尺寸高度计算)
  6. hstack有两个按钮-这应该固定在视图/ScrollView的底部
struct ContentView: View {
        var body: some View {
        GeometryReader { gr in
            ScrollView {
                VStack {
                    Spacer()
                    Image(systemName: "applelogo")
                        .resizable()
                        .frame(width: gr.size.width * 0.5, height: gr.size.height * 0.3, alignment: .center)
                    Spacer().padding(.bottom, gr.size.height * 0.01)
                    Text("SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME")
                        .fontWeight(.regular)
                        .foregroundColor(.green)
                        .multilineTextAlignment(.center)
                        .padding(.top, gr.size.height * 0.05)
                        .padding(.horizontal, 40)
                        .layoutPriority(1)
                    Spacer()
                        .frame(minHeight: gr.size.height * 0.12)
                    HStack {
                        Button(action: {

                        }, label: {
                            Text("Button 1")
                        })
                        .foregroundColor(Color.white)
                        .padding(.vertical)
                        .frame(minWidth: 0, maxWidth: .infinity)
                        .background(Color.blue)
                        .cornerRadius(8)

                        Button(action: {

                        }, label: {
                            Text("Button 2")
                        })
                        .foregroundColor(Color.white)
                        .padding(.vertical)
                        .frame(minWidth: 0, maxWidth: .infinity)
                        .background(Color.blue)
                        .cornerRadius(8)
                    }
                    .padding(.horizontal, 20)
                }
                //.frame(maxWidth: .infinity, maxHeight: .infinity)
            }
        }
    }
}

共有1个答案

范浩宕
2023-03-14
struct SampleView: View {
    var body: some View {
        GeometryReader { gr in
            VStack {
                ScrollView {
                    VStack {

                        // Fills whatever space is left
                        Rectangle()
                            .foregroundColor(.clear)

                        Image(systemName: "applelogo")
                            .resizable()
                            .frame(width: gr.size.width * 0.5, height: gr.size.height * 0.3, alignment: .center)
                            .padding(.bottom, gr.size.height * 0.06)


                        Text("SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME TEXT SOME")
                            .fontWeight(.regular)
                            .foregroundColor(.green)
                            .multilineTextAlignment(.center)
                            .padding(.horizontal, 40)
                            .layoutPriority(1)


                        // Fills 12 %
                        Rectangle()
                            .frame(height: gr.size.height * 0.12)
                            .foregroundColor(.clear)

                        HStack {

                            Button(action: {
                            }, label: {
                                Text("Button 1")
                            })
                            .foregroundColor(Color.white)
                            .padding(.vertical)
                            .frame(minWidth: 0, maxWidth: .infinity)
                            .background(Color.blue)
                            .cornerRadius(8)

                            Button(action: {
                            }, label: {
                                Text("Button 2")
                            })
                            .foregroundColor(Color.white)
                            .padding(.vertical)
                            .frame(minWidth: 0, maxWidth: .infinity)
                            .background(Color.blue)
                            .cornerRadius(8)
                        }
                        .padding(.horizontal, 20)
                        .padding(.bottom, 20)

                    }

                    // Makes the content stretch to fill the whole scroll view, but won't be limited (it can grow beyond if needed)
                    .frame(minHeight: gr.size.height)
                }
            }
        }
    }
}
 类似资料:
  • 问题内容: 我有应该根据内容动态更改高度的容器。对于给定行中的所有容器,无论每个容器的内容如何,​​底部文本都应固定在底部。 我认为与一起使用可以将其推到最低点,但似乎没有任何作用。 问题答案: 您需要使父级成为flex容器: 然后,告诉元素填充可用高度:

  • 问题内容: 我有一个具有以下属性的flex容器(蓝色正方形): 因此,其子项(浅蓝色方块)如下所示排列它们自己。但是,我想从正常流程中添加另一个孩子(绿色正方形)并将其相对于其父对象放置。要将其定位在下面,如您所见,我最好编写类似bottom: 20px;和的内容margin: auto;。 我试着z-index无济于事。我应该如何处理?我应该使用另一个父元素吗? 问题答案: 以下是实现此布局的五

  • 我可以看到VStack接受param,但它是水平对齐。我需要的是,图像应该坚持到它的超级视图的顶部。有没有一种方法可以做到这一点,而不使用Spacer()。 像在react-native中一样,我们曾经有justifyContent和alignItems用于儿童的水平和垂直对齐。 更新: 但是在复杂的视图中,间隔器会产生问题,假设另一个开发人员想在我的视图下面添加一个自定义视图(在本例中是第3行)

  • 我与一些孩子有: 我想要以下布局: 无论中有多少文本,我都希望将始终贴在底部,而不将其从流中取出。我听说Flexbox可以实现这一点,但我不能让它工作。

  • 问题内容: 由于目前无法配置为删除行分隔符,因此我在其内部使用来创建文本元素的垂直布局。下面的例子: 生成的结果被截断为单行。在a之外,它呈现为多行。除了明确设置框架的高度之外,如何在其他内部实现呢? 问题答案: 在 Xcode 11 GM中 : 对于嵌套在滚动视图中的堆栈中的任何视图,请使用解决方法: 如果有多个多行文字,这也适用: 如果堆栈的内容是动态的,则可以使用相同的解决方案:

  • 问题内容: 我正在使用SwiftUI绘制一个表,该表的行和列太多,无法容纳 屏幕宽度/高度。在这种情况下,我无法将视图对齐为 领先,但总是以某种方式居中。我该如何调整他们的领先地位?这 是绘制表格的视图: 这是GridStack: 这就是应用程序中的外观。请注意,边缘不适合 屏幕内部。即使我尝试滚动到那里,它也会反弹回来。 问题答案: 这是一个可能的方法演示(以及改进的方向,因为我 没有测试所有情