【问题标题】:Swift 3 - Programmatically build a button with an image and labelSwift 3 - 以编程方式构建带有图像和标签的按钮
【发布时间】:2017-12-17 19:57:05
【问题描述】:

我目前正在尝试(以编程方式)构建一个带有 5 个 x 按钮的界面,其中包含一个图像和一个标签。

我已经使用 UIStackView(持有 UIButton 和 UIlabel)为 ONE 按钮成功完成了此操作。

我对这个论坛有两个问题......

  1. 可以构建一个 UIButton 来显示标题或图像,可以两者兼得吗?
  2. 可以使用“for in”循环生成 5 个单独的按钮吗?即:一种重用代码的方法,而不是为 5 个按钮、5 个标签、5 个堆栈视图输入代码。

我工作的 UIStackView 按钮代码如下:

    // Button
    let btnSettings = UIButton()
//  btnSettings.setTitle("Settings", for: .normal)
    btnSettings.setImage(#imageLiteral(resourceName: "star-in-circle"), for: .normal)
    btnSettings.heightAnchor.constraint(equalToConstant: 100.0).isActive = true
    btnSettings.widthAnchor.constraint(equalToConstant: 100.0).isActive = true
    btnSettings.contentMode = .scaleAspectFit
    btnSettings.addTarget(self, action: #selector(openSettings), for: .touchUpInside)
    btnSettings.translatesAutoresizingMaskIntoConstraints = false

    // Text Label
    let textLabel = UILabel()
    textLabel.backgroundColor = UIColor.clear
    textLabel.widthAnchor.constraint(equalToConstant: 100.0).isActive = true
    textLabel.heightAnchor.constraint(equalToConstant: 20.0).isActive = true
    textLabel.font = UIFont.boldSystemFont(ofSize: 18)
    textLabel.text = "Settings"
    textLabel.textAlignment = .center

    // Stack View
    let stackView = UIStackView()
    stackView.axis = UILayoutConstraintAxis.vertical
    stackView.distribution = UIStackViewDistribution.equalSpacing
    stackView.alignment = UIStackViewAlignment.center
    stackView.spacing = 1.0

    stackView.addArrangedSubview(btnSettings)
    stackView.addArrangedSubview(textLabel)
    stackView.translatesAutoresizingMaskIntoConstraints = false

    self.view.addSubview(stackView)

    // Constraints
    stackView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
    stackView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true

更新/解决问题 1

我需要使用 button.setBackgroundImage() 以使按钮标题与图像一起显示。

btnSettings.setBackgroundImage(#imageLiteral(resourceName: "star-in-circle"), for: .normal)
btnSettings.setTitle("Button Title", for: .normal)
btnSettings.backgroundColor = UIColor.white

【问题讨论】:

  • 第一个问题的答案是 UIButton 可以同时具有 Title 和 Label 和 Second Answer 是的,您可以在 Loop 的帮助下制作按钮,但是对于操作,您必须为每个 UIButton 提供标签。
  • @GurinderBatth 感谢您的回答。有什么有用的建议吗?我尝试将 button.setTitle() 和 button.setImage() 添加到我的代码中,但它只显示图像,而不显示图像和标题。

标签: ios swift3 uibutton uistackview


【解决方案1】:
  1. 当然,UIButton 可以同时包含图像或/和文本。您可以使用:

    button.setImage(image: UIImage?, for: UIControlState)
    button.setTitle(title: String?, for: UIControlState)
    
  2. 创建一个返回 UIButton 的函数并执行类似的操作:

    let button = generateButton()
    stackView.addArrangedSubview(button)
    

【讨论】:

  • 感谢 Michal,添加您在回答我的问题 #1 时提到的两行,忽略标题。即:它只显示图像。我更改了按钮背景的背景颜色,以防标题被隐藏。图像有背景与前景的顺序吗?图片是在文字前面还是文字在图片前面?我希望在哪里看到与按钮图像相关的按钮标题?
  • 标题应该显示在图片的右侧,并且应该在背景之上。
  • 好的,谢谢。我在 StackView 中同时拥有按钮和文本标签这一事实可能会阻碍按钮标题的显示。我将只使用堆栈之外的基本元素进行更多测试。修复按钮后,我将尝试您对 for-in 循环的第二个答案。谢谢迈克尔
  • 没问题,如果这有帮助,别忘了接受我的回答;)祝你好运。
猜你喜欢
  • 1970-01-01
  • 2019-06-25
  • 2012-09-29
  • 2017-10-14
  • 1970-01-01
  • 2015-02-04
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多