【问题标题】:UIButton with title and image, system selected background doesn't include image带有标题和图像的 UIButton,系统选择的背景不包括图像
【发布时间】:2025-12-15 00:25:01
【问题描述】:

我有一个 .system 类型的 UIButton,我正在使用 Swift 4 以编程方式创建它。它有一个标题和一个图像,我在触摸时打开和关闭 isSelected。当我打开它时,图像标题周围添加了一个可爱的彩色背景,但它没有延伸到足以包含图像的程度。这些图片比我能解释的要好得多:

有没有办法让背景进一步延伸,使图标成为它的一部分?我不介意手动更改图标的颜色,但我尝试过的所有操作(titleEdgeInsets、contentEdgeInsets)只是移动了标题和背景而没有实际扩展它。

我更愿意将按钮保留为 .system 按钮而不是 .custom 按钮,并且我喜欢按钮的框架(以及因此触摸区域)大于彩色背景,因为它更容易触摸,我想如果我设置纯色背景图像来模拟效果,我将不得不减少触摸区域以匹配,这是我不想要的。

任何帮助将不胜感激!提前致谢!

编辑:我添加了一个带有 button.layer.borderWidth = 1 的图像来显示按钮的实际框架,以及它与出现在标题周围的 isSelected 背景有何不同。 (灰色是因为在分组的tableView中)

【问题讨论】:

  • 我的最佳猜测? UIButton 图像与titleLabel 是分开的。我你所拥有的是准确的。也许你可以尝试一些东西。 (1) 有 两张 图片 - 一张用于normal,一张用于isSelected。 (2)子类UIButton,而不是使用它的罐头图像,添加你自己的UIImageView,背景清晰。最后,(3) 滚动你自己的UIButton 并完成点击手势。

标签: ios swift uibutton uikit


【解决方案1】:

如果使用SF符号,可以将图片作为titleLabel的一部分:

let attachment = NSTextAttachment()
attachment.image = UIImage(systemName: "checkmark.circle")

let imageString = NSMutableAttributedString(attachment: attachment)
let textString = NSAttributedString(string: "Please try again")
imageString.append(textString)

然后将 imageString 设置为 UIButton.attributedTitle。

https://www.hackingwithswift.com/articles/237/complete-guide-to-sf-symbols

尚未使用自定义图像进行测试。

【讨论】:

    【解决方案2】:

    简短的回答是.system 按钮实际上只需要图像或标题,而不是两者。 (See this for a more comprehensive matrix highlighting your issue)

    不过,对于您的情况,.system 按钮并没有什么特别之处。创建一个.custom 按钮并圆形button.layer.cornerRadius 以获得角效果。

    【讨论】: