swiftUI如何使视图的宽度等于超级视图

Arg*_*gas 10 ios13 swiftui

我有 Button 在此处输入图片说明

struct ContentView : View {
var body: some View {
    HStack {
        Button(action: {}) {
            Text("MyButton")
                .color(.white)
                .font(Font.system(size: 17))
        }
        .frame(height: 56)
        .background(Color.red, cornerRadius: 0)
    }
}
}
Run Code Online (Sandbox Code Playgroud)

但是我想将其固定在supreview的边缘(跟踪到superview的尾随和领先)。像这样:

在此处输入图片说明

HStack对我没有帮助,这是期望。固定frame或宽度等于UIScree.size不是灵活的解决方案。

Den*_*Fav 16

您需要使用.frame(minWidth: 0, maxWidth: .infinity)修饰符

添加下一个代码

        Button(action: tap) {
            Text("Button")
                .frame(minWidth: 0, maxWidth: .infinity)
                .background(Color.red)
        }
        .padding([.leading, .trailing], 20)
Run Code Online (Sandbox Code Playgroud)

填充修改器将使您在边缘有一些空间。

请记住,修饰符的顺序很重要。因为修饰符实际上是包裹视图的函数(它们不更改视图的属性)

  • `.infinity` 是个好东西,谢谢!但是不可能将一些 instets 设置为 superview。但是如果将 .frame(minWidth: 0, maxWidth: .infinity) 设置为 `Text`,并将 `padding()` 添加到 `Button` - 它会起作用! (3认同)
  • 一个小的补充是,如果您想要两侧填充,现在可以使用“.padding(.horizo​​ntal, 20)”,而无需单独提及左侧和右侧。 (2认同)

Mat*_*ini 12

您可以使用GeometryReaderhttps : //developer.apple.com/documentation/swiftui/geometryreader

根据苹果的说法:

此视图将灵活的首选大小返回到其父布局。

在此处输入图片说明

这是一种灵活的解决方案,因为它会根据父布局的变化而变化。

  • 不要像图片一样添加代码 (7认同)

She*_*deh 7

这是一个纯 SwiftUI 解决方案,您想要填充父级的宽度,但将高度限制为任意纵横比(假设您想要方形图像):

        Image("myImage")
            .resizable()
            .scaledToFill()
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .aspectRatio(16.0 / 9.0, contentMode: .fit)
Run Code Online (Sandbox Code Playgroud)

只需将 16.0 / 9.0 替换为您想要的任何纵横比即可。

我花了大约一天的时间试图解决这个问题,因为我不想使用 GeometryReader 或 UIScreen.main.bounds (这不是跨平台的)

编辑:找到了一种更简单的方法。


Tej*_*jas 5

简单地向您的代码添加以下内容将使按钮边缘到边缘扩展。(如果需要,您也可以添加填充)

.frame(minWidth: 0, maxWidth: .infinity)
Run Code Online (Sandbox Code Playgroud)

整个 Button 代码如下所示:

struct ContentView : View {
    var body: some View {
        HStack {
            Button(action: {}) {
                Text("MyButton")
                    .color(.white)
                    .font(Font.system(size: 17))
            }
            .frame(minWidth: 0, maxWidth: .infinity)
            .padding(.top, 8)
            .padding(.bottom, 8)
            .background(Color.red, cornerRadius: 0)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)