如何在macOS中修改SwiftUI默认Button尺寸 实现多按钮自动等宽
解决方案
核心问题是修饰符应用顺序和自定义ButtonStyle的内部适配问题,你可以按以下方案调整:
方案1:调整修饰符顺序+统一样式规则
Button的修饰符顺序会影响效果,你需要把frame相关规则内置到自定义ButtonStyle中,让两个按钮共享同一套尺寸逻辑,HStack会自动均分宽度,高度自动匹配最高的按钮:
import SwiftUI // 适配尺寸的自定义ButtonStyle,兼容默认交互效果 struct MorePaddingButtonStyle: ButtonStyle { let bgColor: Color func makeBody(configuration: Configuration) -> some View { configuration.label .padding() // 统一内边距 .frame(maxWidth: .infinity, maxHeight: .infinity) // 占满所有可用空间 .background(bgColor) .opacity(configuration.isPressed ? 0.7 : 1) // 适配默认按压效果 } } struct ContentView: View { var body: some View { HStack(spacing: 16) { // 可自定义按钮间距 Button("ABC") {} .buttonStyle(MorePaddingButtonStyle(bgColor: .green)) Button("EFCHHSJFJSJDNJS") {} .buttonStyle(MorePaddingButtonStyle(bgColor: .yellow)) } .fixedSize(horizontal: false, vertical: true) // 高度自适应最高的按钮,宽度撑满父视图 .frame(maxWidth: .infinity) .padding() // 可选父视图内边距 } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
如果需要按钮撑满父视图的全部高度,删除.fixedSize(horizontal: false, vertical: true)这行即可。
方案2:保留独立样式只需同步尺寸
不需要统一ButtonStyle的话,给每个按钮都加上maxHeight: .infinity,并且保证frame修饰符放在background、buttonStyle之前即可:
HStack { Button("ABC", action: {}) .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.green) Button("EFCHHSJFJSJDNJS", action: {}) .frame(maxWidth: .infinity, maxHeight: .infinity) .buttonStyle(MorePaddingButtonStyle()) .background(Color.yellow) } .fixedSize(horizontal: false, vertical: true) .frame(maxWidth: .infinity)
以上两种方案都可以实现两个按钮宽高完全一致,按钮的可点击区域和背景也会完全同步,同时兼容默认的Button交互效果。
内容的提问来源于stack exchange,提问作者Willey3x37
相关产品推荐
相关产品推荐

