Style — ButtonStyle

ButtonStyle 是 SwiftUI 提供的一种自定义按钮外观和交互方式的机制,允许我们创建可复用的按钮样式,并在多个 Button 组件上应用。


🔹 基本使用 #

我们可以创建一个自定义的 ButtonStyle,然后在多个 Button 组件上使用它。

📝 自定义 ButtonStyle #

struct CustomButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .padding()
            .background(configuration.isPressed ? Color.gray : Color.blue)
            .foregroundColor(.white)
            .cornerRadius(10)
            .scaleEffect(configuration.isPressed ? 0.95 : 1.0) // 点击时缩小
            .animation(.easeInOut(duration: 0.2), value: configuration.isPressed)
    }
}

📌 关键点

  • configuration.label 代表 Button 的内容(TextImage 等)。
  • configuration.isPressed 表示按钮是否被按下。
  • .background().scaleEffect() 让按钮在点击时有视觉反馈。
  • animation(.easeInOut(duration: 0.2)) 让交互更平滑。

🎯 使用 ButtonStyle #

Button("Tap Me") {
    print("Button tapped!")
}
.buttonStyle(CustomButtonStyle()) // 应用样式

🔹 预设 ButtonStyle #

SwiftUI 也提供了一些内置样式,可以直接使用:

Button("Default") { }
    .buttonStyle(DefaultButtonStyle()) // 默认样式

Button("Plain") { }
    .buttonStyle(PlainButtonStyle()) // 去掉所有默认样式

Button("Borderless") { }
    .buttonStyle(BorderlessButtonStyle()) // 类似 Plain,但不会影响菜单按钮

🔹 适用于特定类型的按钮 #

如果你的 ButtonStyle 只适用于某种特定的 Button,可以使用条件限制

struct RedButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .padding()
            .background(Color.red)
            .foregroundColor(.white)
            .cornerRadius(8)
    }
}

// 只让 `Destructive` 类型的按钮使用这个样式
extension ButtonStyle where Self == RedButtonStyle {
    static var destructive: RedButtonStyle { RedButtonStyle() }
}

Button("Delete") { }
    .buttonStyle(.destructive) // 使用自定义扩展

🔹 ButtonStyle vs .buttonStyle() vs .background() #

方式适用场景可复用性
.background() + .padding()适用于单个按钮需要手动复制样式
.buttonStyle(CustomButtonStyle())适用于多个按钮高,可复用
.buttonStyle(DefaultButtonStyle())适用于默认按钮
.buttonStyle(PlainButtonStyle())适用于去掉默认交互

🚀 如果要自定义多个按钮,使用 ButtonStyle 更好!

本文共 471 字,创建于 Feb 12, 2025
相关标签: SwiftUI, Xcode