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)