How to create a tappable button
How to create a tappable button 관련
Updated for Xcode 15
Updated in iOS 15
SwiftUI's button is similar to UIButton
, except it's more flexible in terms of what content it shows and it uses a closure for its action rather than the old target/action system.
To create a button with a string title you would start with code like this:
Button("Button title") {
print("Button tapped!")
}
For example, you might make a button that shows or hides some detail text when it's tapped:
struct ContentView: View {
@State private var showDetails = false
var body: some View {
VStack(alignment: .leading) {
Button("Show details") {
showDetails.toggle()
}
if showDetails {
Text("You should follow me on Twitter: @twostraws")
.font(.largeTitle)
}
}
}
}
The title inside the button can be any kind of view, so you can create an image button like this:
struct ContentView: View {
@State private var showDetails = false
var body: some View {
Button {
print("Image tapped!")
} label: {
Image("sunset")
}
}
}
Using a custom label is really helpful for times you want to increase the tappable area of a button, because you can apply padding to the label then use contentShape(Rectangle())
or similar to make the whole area tappable.
For example, this adds 20 points of padding to a button's label, to ensure it's tappable in a much larger space than would otherwise be possible:
Button {
print("Button pressed")
} label: {
Text("Press Me")
.padding(20)
}
.contentShape(Rectangle())
If you're targeting iOS 15 or later, you can also attach a role to your button that helps SwiftUI know what kind of styling should be attached to the button. For example, if we had a Delete button we might mark it with the .destructive
role so SwiftUI can highlight it in red when it makes sense:
Button("Delete", role: .destructive) {
print("Perform delete")
}
There's also a .cancel
role, and again it gives SwiftUI that extra bit of context to present it appropriately.