如何在 SwiftUI 中将图像设置为按钮?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中将图像设置为按钮?【英文标题】:How to set image to button in SwiftUI? 【发布时间】:2019-09-08 16:11:17 【问题描述】:

我想添加一个带有图片的按钮(在左侧),如下:

可能,当涉及到UIButton时,它似乎与setImage(_:for:)相似。

到目前为止我所做的是:

Button(action: ) 
    Text("Add To Cart")
        .foregroundColor(.black)
        .padding(.all, 10.0)

.background(Color.gray)
.cornerRadius(5.0)

结果与要求的结果非常接近:

但是,我在SwiftUI Button 中找不到任何与设置图像相关的属性/方法。

如何解决?

【问题讨论】:

【参考方案1】:

您可以将其实现为:

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,因此您不必为它返回Text 类型(如问题代码sn-p 中所述)。

显然,您可以通过在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())

【讨论】:

【参考方案2】:

你为什么不直接

Button(action: ) 
    Label("Add to cart", systemImage: "cart")
  

【讨论】:

以上是关于如何在 SwiftUI 中将图像设置为按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何在浮动操作按钮中将图像设置为居中裁剪

AppKit 上的 SwiftUI - 在弹出窗口中将焦点设置为 TextField

如何在 SwiftUI 中将视图的背景设置为灰色?

如何在 SwiftUI 中将我的环境对象设置为用户输入?

如何在 SwiftUI 中将自定义字体系列设置为整个应用程序的默认字体

无法在 SwiftUI 中将类型“图像”的值转换为预期的参数类型“字符串”