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

时间:2019-09-08 16:11:17

标签: button swiftui

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

enter image description here

UIButton方面,它似乎与setImage(_:for:)类似。

到目前为止,我所做的是:

Button(action: {}) {
    Text("Add To Cart")
        .foregroundColor(.black)
        .padding(.all, 10.0)
}
.background(Color.gray)
.cornerRadius(5.0)

结果非常接近所需的结果:

enter image description here

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

如何解决?

2 个答案:

答案 0 :(得分:2)

您可以将其实现为:

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类型(如问题代码中所述)片段)。

很显然,您可以通过在Text之前添加Image将图像添加到标签的右侧。另外,如果您打算将文本添加到图像上方(反之亦然),则可以简单地将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())

答案 1 :(得分:0)

你为什么不只是

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Storage.Blob" Version="11.2.2" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="4.0.3" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.11" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>