46

我有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)
        }
    }
}

但我想把它固定在 superview 的边缘(拖到 superview 的尾随和前导)。像这样:

在此处输入图像描述

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

4

5 回答 5

81

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

添加下一个代码

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

填充修饰符将允许您在边缘留出一些空间。

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

于 2019-06-08T17:42:39.520 回答
29

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

据苹果称:

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

在此处输入图像描述

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

于 2019-06-08T17:16:13.833 回答
4

简单地在代码中添加以下内容将使按钮边到边延伸。(如果需要,您也可以添加填充)

.frame(minWidth: 0, maxWidth: .infinity)

整个 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)
        }
    }
}
于 2019-09-26T06:43:48.843 回答
3

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

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

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

我花了大约一天的时间试图弄清楚这一点,因为我不想使用 GeometryReader 或 UIScreen.main.bounds (它不是跨平台的)

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

于 2020-11-18T22:00:12.240 回答
2

我找到了一种解决方案:

var body: some View {
    Button(action: {}) {
            HStack {
                Spacer()
                Text("MyButton")
                    .color(.white)
                    .font(Font.system(size: 17))
                Spacer()
            }
            .frame(height: 56)
            .background(Color.red, cornerRadius: 0)
        }.padding(20)
}

但我不确定它是否是最好的。可能有人会找到更优雅的解决方案/

于 2019-06-08T17:04:35.233 回答