Ios SwiftUI:如何调整大小以适合按钮展开以填充VStack或HStack父视图?

Ios SwiftUI:如何调整大小以适合按钮展开以填充VStack或HStack父视图?,ios,swift,user-interface,swiftui,Ios,Swift,User Interface,Swiftui,我试图创建两个宽度相等的按钮,一个垂直放置在另一个上面。应该是这样的: 我在一个VStack内放置了2个按钮,它会自动扩展到较大按钮的宽度。我想做的是让按钮的宽度扩展以填充VStack的宽度,但我得到的是: 设置VStack的宽度会将其展开,但按钮不会展开以适合: VStack(alignment: .center, spacing: 20) { ... }.frame(width: 320) .background(Color.secondary) 所以我的问题是: 除

我试图创建两个宽度相等的按钮,一个垂直放置在另一个上面。应该是这样的:

我在一个
VStack
内放置了2个
按钮
,它会自动扩展到较大按钮的宽度。我想做的是让按钮的宽度扩展以填充
VStack
的宽度,但我得到的是:

设置
VStack
的宽度会将其展开,但按钮不会展开以适合:

VStack(alignment: .center, spacing: 20) {
    ...
}.frame(width: 320)
    .background(Color.secondary)

所以我的问题是:

除了手动设置布局中每个项目的框架外,还有什么方法可以做到这一点吗?


我宁愿不必指定每一个,因为这将变得难以管理。

设置
.infinity
作为
maxWidth
,可以使用
帧(minWidth:maxWidth:minHeight:)
API使子视图展开以填充:

VStack(alignment: .center, spacing: 20) {

    NavigationLink(destination: CustomView()) {
        Text("Button")
    }.frame(minWidth: 100, maxWidth: .infinity, minHeight: 44)
        .background(Color.primary)

    Button(action: { self.isShowingAlert = true }) {
        Text("Another Button")
    }.frame(minWidth: 100, maxWidth: .infinity, minHeight: 44)
        .background(Color.primary)

}.frame(width: 340)
    .background(Color.secondary)

您必须在按钮内部的
文本
本身上使用带有
maxWidth:.infinity
的框架修改器,这将强制
按钮变宽:

VStack(对齐:。中心,间距:20){
导航链接(目标:CustomView()){
文本(“按钮”)
.frame(最大宽度:无穷大,高度:44)
}
.背景(颜色.主)
按钮(操作:{self.isShowingAlert=true}){
文本(“另一个按钮”)
.frame(最大宽度:无穷大,高度:44)
}
.背景(颜色.主)
}.背景(颜色.次要)
这适用于iOS,但不适用于使用默认按钮样式的macOS,默认按钮样式使用AppKit的
NSButton
,因为它拒绝变宽(或变高)。macOS中的诀窍是在按钮上使用
.buttonStyle()
修改器(或
导航链接
),并创建自己的自定义按钮样式,如下所示:

struct MyButtonStyle:ButtonStyle{
func makeBody(配置:配置)->一些视图{
配置标签
.背景(配置.isPressed?颜色.蓝色:颜色.灰色)
}
}

您必须将框架修改器应用于
文本
视图而不是按钮本身的原因是,按钮更愿意坚持其内容的大小,而不是包含按钮的视图所建议的大小。这意味着,如果将框架修改器应用于按钮,而不是其中的
文本
,则按钮实际上将保持与
文本
相同的大小,并且
返回的视图将扩展以填充包含它的视图的宽度,因此,您将无法在
文本
视图的边界之外点击/单击按钮

VStack(alignment: .center, spacing: 20) {

    NavigationLink(destination: CustomView()) {
        Text("Button")
    }.frame(minWidth: 100, maxWidth: .infinity, minHeight: 44)
        .background(Color.primary)

    Button(action: { self.isShowingAlert = true }) {
        Text("Another Button")
    }.frame(minWidth: 100, maxWidth: .infinity, minHeight: 44)
        .background(Color.primary)

}.frame(width: 340)
    .background(Color.secondary)