为啥我的 Button 样式对象仅适用于按钮内的文本,而不适用于整个按钮?

Posted

技术标签:

【中文标题】为啥我的 Button 样式对象仅适用于按钮内的文本,而不适用于整个按钮?【英文标题】:Why does my Button style object only work on the text within the button and not the entire button?为什么我的 Button 样式对象仅适用于按钮内的文本,而不适用于整个按钮? 【发布时间】:2020-04-24 19:35:48 【问题描述】:

我有一个ButtonStyle 对象,我希望在点击Button 时使用它。但是,当我在我的Button 上调用它时,效果仅在按钮内的文本上可见,而不是在整个Button 上。 我试过在外面打电话,但无济于事。有人可以向我解释如何解决我的错误吗?

Button(action: 

    ) 
        Text("Button")
            .foregroundColor(.white)
    .background(Color.red)
     .buttonStyle(ScaleButtonStyle())


struct ScaleButtonStyle: ButtonStyle 
    func makeBody(configuration: Self.Configuration) -> some View 
        configuration.label
            .scaleEffect(configuration.isPressed ? 5 : 1)
    

编辑:

Button(action: ) 
            Text("Button")
                .fontWeight(.semibold)
                .foregroundColor(.white)
                .font(.title)
        
        .buttonStyle(ScaleButtonStyle(bgColor: Color.red))
        .frame(width: geo.size.width*0.8, height: geo.size.height*0.1, alignment: .center)
        .background(Color.red)
        .clipShape(Rectangle())


struct ScaleButtonStyle: ButtonStyle 
 let bgColor: Color

 func makeBody(configuration: Self.Configuration) -> some View 
    configuration.label
        .background(bgColor)
        .scaleEffect(configuration.isPressed ? 5 : 1)
 

【问题讨论】:

【参考方案1】:

解决方案是将背景作为按钮样式的一部分,如下所示。

使用 Xcode 11.4 / ios 13.4 测试

struct ScaleButtonStyle: ButtonStyle 
    let bgColor: Color
    func makeBody(configuration: Self.Configuration) -> some View 
        configuration.label
            .background(bgColor)
            .scaleEffect(configuration.isPressed ? 5 : 1)
    


struct TestScaleButtonStyle: View 
    var body: some View 
        Button(action:  ) 
            Text("Button")
                .foregroundColor(.white)
        .buttonStyle(ScaleButtonStyle(bgColor: Color.red))
    

【讨论】:

非常感谢您的回复,但不幸的是,代码仍然只使按钮视图中的文本视图缩放,而不是按钮本身的整个框架。编辑:已编辑问题以使用您建议的 ButtonStyle 结构反映代码 @mogoco8594、scaleEffect 以及任何其他几何效果都不会更改视图的布局框架,因此任何此类修改只会影响按钮的呈现,而不影响布局。 对不起,我没有意识到这一点,感谢您的解释

以上是关于为啥我的 Button 样式对象仅适用于按钮内的文本,而不适用于整个按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何定位父级内的所有标签

为啥我的 SASS 风格只适用于部分?

为啥按钮元素允许垂直对齐:中间?

更改 Xamarin Forms Picker 按钮样式 [重复]

jQuery ID 选择器仅适用于第一个元素

按钮不在移动设备上工作,但适用于PC引导程序