使用自动布局将图像和文本设置为按钮

Posted

技术标签:

【中文标题】使用自动布局将图像和文本设置为按钮【英文标题】:Setting Image and Text to Button with AutoLayout 【发布时间】:2018-10-11 16:06:15 【问题描述】:

我正在尝试以编程方式在文本右侧创建一个带有下拉箭头的按钮,如下所示:

我见过的解决方案使用了标题和图像插入,但是有没有办法以编程方式使用 autoLayout 设置这些?根据选择的选项,按钮中的文本可能会发生变化,并且文本长度会有所不同,所以我不确定标题和边缘插图是否适合。

【问题讨论】:

UIButton 在内部不以您可以访问的方式使用自动布局。您可以创建一个自定义的类似按钮的视图。 【参考方案1】:

这是一个 UIStackView 放置在主 VC 容器视图中的示例(在我的例子中,UIStackView 占用了 VC 内的所有可用空间)。在这种情况下,基本用户信息添加了电话号码。

我创建了一个电话号码容器视图 (UIView),一个 UILabel 来包含电话号码。不。和一个UIImageView 作为下拉箭头。

let telNoContainerView: UIView = 
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
()
let telNoLabel: UILabel = 
    let view = UILabel()
    let font = UIFont.systemFont(ofSize: 15)
    view.font = font
    view.backgroundColor = UIColor.white
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
()
let telNoImageView: UIImageView = 
    let view = UIImageView()
    view.backgroundColor = UIColor.white
    view.tintColor = ACTION_COLOR
    view.image = UIImage(named: "Chevron")?.withRenderingMode(.alwaysTemplate)
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
()

setBasicInfoViews() 中,只需将telNoContainerView 添加到UIStackView。然后将UILabelUIImageView 添加到包含视图telNoContainerView。之后根据需要添加约束。 您需要更改约束以适应您的 UI 设计。

fileprivate func setBasicInfoViews()
    infoStackView.addArrangedSubview(telNoContainerView)

    telNoContainerView.addSubview(telNoLabel)
    telNoContainerView.addSubview(telNoImageView)
    NSLayoutConstraint.activate([
        telNoLabel.topAnchor.constraint(equalTo: telNoContainerView.topAnchor, constant: 0.0),
        telNoLabel.bottomAnchor.constraint(equalTo: telNoContainerView.bottomAnchor, constant: 0.0),
        telNoLabel.leadingAnchor.constraint(equalTo: telNoContainerView.leadingAnchor, constant: 0.0),
        telNoLabel.trailingAnchor.constraint(equalTo: telNoContainerView.trailingAnchor, constant: 0.0)
        ])
    NSLayoutConstraint.activate([
        telNoImageView.centerYAnchor.constraint(equalTo: telNoLabel.centerYAnchor, constant: 0.0),
        telNoImageView.heightAnchor.constraint(equalToConstant: 30.0),
        telNoImageView.widthAnchor.constraint(equalToConstant: 30.0),
        telNoImageView.trailingAnchor.constraint(equalTo: telNoLabel.trailingAnchor, constant: 0.0)
        ])

【讨论】:

【参考方案2】:

不,没有办法使用 AutoLayout 在 UIButton 上设置图像和标题布局属性。

如果您想要 UIButton 中的图像和标题的完全自定义布局,我建议创建 UIView 并使用 AutoLayout 添加 titleimage 作为子视图,然后添加轻击手势识别器界面视图

buttonView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.buttonAction)))

【讨论】:

以上是关于使用自动布局将图像和文本设置为按钮的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局在某些单元格中加载图像

使用自动布局创建带有文本和图像的 iOS 7 UIButton

使用自动布局根据超级视图背景图像放置视图

自动布局等间距和加权间距

使用自动布局和约束设置按钮

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