避免在 SwiftUI 中为其内容设置按钮样式

Avoid button styling its content in SwiftUI

我正在使用 Apple 的 SwiftUI 框架创建一个 iOS 应用程序。因为我需要检测用户是否点击了屏幕的特定区域,所以我显然使用了一个按钮。

问题是该区域包含一个图像和一个文本,并且由于按钮自动为其内容赋予蓝色,图像也是彩色的,所以它不是图像,而是一个蓝色的圆角矩形。

都说一图抵千言,我懒得解释了,给大家图解一下:

按钮外(无按钮样式)

按钮内部(带有按钮样式)

发生这种情况是因为按钮正在向图像添加 .foregroundColor(.blue)

如何 avoid/disable 按钮为其组件添加样式?

编辑:这是我的按钮代码:

ContentView.swift:

Button(action: {/* other code */}) {
                    PackageManagerRow(packageManager: packageManagersData[0])
                }

PackageManagerRow.swift:

struct PackageManagerRow : View {
    var packageManager : PackageManager

    var body: some View {
        VStack {
            HStack {
                Image(packageManager.imageName)
                    .resizable()
                    .frame(width: 42.0, height: 42.0)
                Text(verbatim: packageManager.name)
                Spacer()
                Image(systemName: "checkmark")
                    .foregroundColor(.blue)
                    .opacity(0)
            }.padding(.bottom, 0)
            Divider()
                .padding(.top, -3)
        }
    }
}

我认为这是来自您正在使用的图像的渲染模式。

你有Image("Cydia logo")(或其他)的地方。

您应该将渲染模式设置为...

Image("Cydia Logo").renderingMode(.original)
HStack {
    Button(action: {
        print("Tapped")
     }, label: {
         Image("Logo").renderingMode(.original) // Add Rendering Mode
     })
    Text("Cydia")
}

另一种选择是不使用 Button 包装器,而是使用 tapAction directly on the Image 在按下图像时触发您的操作

您必须在图像声明后立即添加 .renderingMode(.original) 来渲染原始图像。

Image("your_image_name")
    .renderingMode(.original)

您还可以将 PlainButtonStyle() 添加到您的按钮以避免 iOS 样式行为。

与您的示例类似:

Button(action: {/* other code */}) {
                    PackageManagerRow(packageManager: packageManagersData[0])
                }.buttonStyle(PlainButtonStyle())

希望对您有所帮助!

一个带图标的按钮!多么原始。 如果您正在处理 SF 符号,那么以下内容就可以了:

    Button(action: addItem) {
        Text(Image(systemName: "plus").renderingMode(.original))
            +
            Text("This is Plus")
    }
    .font(.system(size: 42))
        

上述选项的局限性在于您无法控制 Image 的大小。因此对于自定义图像,以下内容更合适:

    Button(action: addItem) {
        Label(
            title: { Text("Label").font(.system(size: 40)) }, // Any font you like
            icon: { Image(systemName: "rectangle.and.pencil.and.ellipsis") // Both custom and system images, i.e. `Image("Cydia logo")`
                .renderingMode(.original)
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 42, height: 42) // Any size you like
                .padding() // Any padding you need
                } // and etc.
        )
    }