如何在 SwiftUI 中将图像设置为按钮?
How to set image to button in SwiftUI?
我想添加一个带图片的按钮(左边),如下:
大概,说到UIButton
,好像和setImage(_:for:)
差不多。
到目前为止我所做的是:
Button(action: {}) {
Text("Add To Cart")
.foregroundColor(.black)
.padding(.all, 10.0)
}
.background(Color.gray)
.cornerRadius(5.0)
结果非常接近要求的结果:
但是,我在 SwiftUI Button 中找不到任何与设置图像相关的 property/method。
如何解决?
您可以将其实现为:
Button(action: {}) {
HStack(alignment: .center, spacing: 5.0) {
Image("cart")
.padding(.leading, 10.0)
Text("Add to Cart")
.foregroundColor(.black)
.padding(.all, 10.0)
}
}
.background(Color.gray)
.cornerRadius(5.0)
传递 HStack
而不是 Text
就可以了。
澄清一下,在按钮标签旁边添加图像不再与按钮直接相关!使用 init(action:label:)
初始化器创建按钮时,我们将 () -> Label
作为第二个参数传递;如果你跟踪 Label
的类型,你会发现它基本上是一个 View
,所以你不必为它强制 return 一个 Text
类型(如前所述在问题的代码片段中)。
显然,您可以通过在 Image
之前添加 Text
来将图像添加到标签的右侧。此外,如果您打算在图像顶部添加文本(反之亦然),您只需将 HStack
替换为 VStack
.
此外,更多可重用代码
您可以通过为按钮创建自定义正文 View
来提高代码的可重用性。此外,您可以创建自定义 ViewModifier
:
import SwiftUI
// Custom View
struct CustomButtonBody: View {
private var iconName: String
private var title: String
init(iconName: String = "cart", title: String) {
self.iconName = iconName
self.title = title
}
var body: some View {
HStack(alignment: .center, spacing: 5.0) {
Image(iconName)
.padding(.leading, 10.0)
Text(title)
.foregroundColor(.black)
.padding(.all, 10.0)
}
}
}
// Custom Modifier
struct CustomButtonModifier: ViewModifier {
func body(content: Content) -> some View {
return content
.background(Color.gray)
.cornerRadius(5.0)
}
}
因此:
Button(action: {}) {
CustomButtonBody(title: "Add to Cart")
}
.modifier(CustomButtonModifier())
你为什么不
Button(action: {}) {
Label("Add to cart", systemImage: "cart")
}
我想添加一个带图片的按钮(左边),如下:
大概,说到UIButton
,好像和setImage(_:for:)
差不多。
到目前为止我所做的是:
Button(action: {}) {
Text("Add To Cart")
.foregroundColor(.black)
.padding(.all, 10.0)
}
.background(Color.gray)
.cornerRadius(5.0)
结果非常接近要求的结果:
但是,我在 SwiftUI Button 中找不到任何与设置图像相关的 property/method。
如何解决?
您可以将其实现为:
Button(action: {}) {
HStack(alignment: .center, spacing: 5.0) {
Image("cart")
.padding(.leading, 10.0)
Text("Add to Cart")
.foregroundColor(.black)
.padding(.all, 10.0)
}
}
.background(Color.gray)
.cornerRadius(5.0)
传递 HStack
而不是 Text
就可以了。
澄清一下,在按钮标签旁边添加图像不再与按钮直接相关!使用 init(action:label:)
初始化器创建按钮时,我们将 () -> Label
作为第二个参数传递;如果你跟踪 Label
的类型,你会发现它基本上是一个 View
,所以你不必为它强制 return 一个 Text
类型(如前所述在问题的代码片段中)。
显然,您可以通过在 Image
之前添加 Text
来将图像添加到标签的右侧。此外,如果您打算在图像顶部添加文本(反之亦然),您只需将 HStack
替换为 VStack
.
此外,更多可重用代码
您可以通过为按钮创建自定义正文 View
来提高代码的可重用性。此外,您可以创建自定义 ViewModifier
:
import SwiftUI
// Custom View
struct CustomButtonBody: View {
private var iconName: String
private var title: String
init(iconName: String = "cart", title: String) {
self.iconName = iconName
self.title = title
}
var body: some View {
HStack(alignment: .center, spacing: 5.0) {
Image(iconName)
.padding(.leading, 10.0)
Text(title)
.foregroundColor(.black)
.padding(.all, 10.0)
}
}
}
// Custom Modifier
struct CustomButtonModifier: ViewModifier {
func body(content: Content) -> some View {
return content
.background(Color.gray)
.cornerRadius(5.0)
}
}
因此:
Button(action: {}) {
CustomButtonBody(title: "Add to Cart")
}
.modifier(CustomButtonModifier())
你为什么不
Button(action: {}) {
Label("Add to cart", systemImage: "cart")
}