带有标题和图像的 UIButton

Posted

技术标签:

【中文标题】带有标题和图像的 UIButton【英文标题】:UIButton with title and image 【发布时间】:2017-09-27 09:05:54 【问题描述】:

我需要一个按钮,里面有一个图像,按钮下面有一个文本。我不能将图像用作背景,因为它会拉伸图像。所以我的问题是如果我为按钮使用图像,标题将被图像覆盖。有什么解决办法吗?

下面是一个例子,它应该是什么样子的:

【问题讨论】:

是的,您可以通过调整标题和图片插图来实现。 【参考方案1】:

你有两个选择

1) 创建 UIView 添加 Image , label 和 button

2) 您可以设置 Title 和 Image inset ,您可以在 XIB 中轻松完成

对于选项二,我添加了简单的示例,(将其替换为您的值)

【讨论】:

【参考方案2】:

更改标题和图片插图

也改变控制垂直到底部

【讨论】:

它对我不起作用......标题仍然被覆盖【参考方案3】:

你可以在你喜欢的位置制作一个单独的 UIImage 和 UILabel,并用透明的 UIButton 覆盖它们。 这应该可以解决问题。

希望对你有帮助。

【讨论】:

【参考方案4】:

您可以继承 UIButton 并重新定义 layoutSubviews 方法。

【讨论】:

【参考方案5】:

您可以调整UIButton的以下属性:var titleEdgeInsets: UIEdgeInsetsvar imageEdgeInsets: UIEdgeInsets

另一种方法是继承UIControl。这是一个UIView 子类,旨在用于此类情况。例如,UIButtonUIControl 的子类。这样您就可以更好地控制布局,而无需对抗 UIButton 的内置行为。

您可以在代码中或在 xib 文件中使用 Interface Builder 进行布局。

class MyButton: UIControl 

    var imageView: UIImageView
    var label: UILabel

    // adjust colors for changed states like highlighting, etc.
    override var isHighlighted: Bool 
        didSet  
            if isHighlighted 
                backgroundColor = UIColor.grey              
             else 
                backgroundColor = UIColor.white             
            
        
    

    override var isSelected: Bool  didSet  ...      
    override var isEnabled: Bool  didSet  ...  

    override init(frame: CGRect) 
        super.init(frame: frame)
        commonInit()
    

    override init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        commonInit()
    

    func commonInit() 
        imageView = UIImageView(image: UIImage(...))
        addSubView(imageView)
        label = UILabel(frame: CGRect(...))     
        addSubView(label)
        // TODO: add constraints for layout
    

【讨论】:

以上是关于带有标题和图像的 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

带有图像和标题的 UIBarButtonItem 初始化程序不显示标题

带有标题、左侧图像和右侧文本的 HTML 卡

制作带有边框和填充的菱形图像

带有背景图像和标题的 UIButton 使用自动布局

带有图像和文本的 HTML 标头 - 将文本与底部对齐?

带有纵向和横向图像的 UIBarButtonItem 可能会显示横向的纵向图像