首页 > 解决方案 > 用不同的字体大小对齐 UIButton 和 UILabel 文本

问题描述

我有一个UIButton和一个UILabel显示的内联。它们有不同大小的字体,但是我想对齐它们,使它们出现在同一行。

目前,UILabel略高于UIButton.

我希望避免手动设置内容偏移量,因为我希望它在可能的情况下正确缩放。我担心手动计算可能会对更改字体大小等产生意想不到的副作用。

未对齐的元素

我创建了一个应该显示 2 个元素的游乐场:

//: A UIKit based Playground for presenting user interface

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {

  lazy var nameButton = configure(UIButton(type: .system), using: {
    $0.translatesAutoresizingMaskIntoConstraints = false
    $0.titleLabel?.font = .systemFont(ofSize: 18)
    $0.setTitleColor(.darkGray, for: .normal)
    $0.contentHorizontalAlignment = .leading
    $0.setContentHuggingPriority(UILayoutPriority.defaultHigh, for: .horizontal)
    $0.backgroundColor = .lightGray
    $0.setTitle("This is a button", for: .normal)
  })

  lazy var publishedDateLabel = configure(UILabel(frame: .zero), using: {
    $0.translatesAutoresizingMaskIntoConstraints = false
    $0.font = .systemFont(ofSize: 14)
    $0.textColor = .darkGray
    $0.setContentHuggingPriority(UILayoutPriority.defaultLow, for: .horizontal)
    $0.backgroundColor = .lightGray
    $0.text = "and this is a label"
  })

  override func loadView() {
    let view = UIView()
    view.backgroundColor = .white

    [nameButton, publishedDateLabel].forEach(view.addSubview(_:))

    NSLayoutConstraint.activate([
      nameButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
      nameButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8),

      publishedDateLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor),
      publishedDateLabel.leadingAnchor.constraint(equalTo: nameButton.trailingAnchor),
      publishedDateLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8)
    ])

    self.view = view
  }

  // setup helper method
  func configure<T>(_ value: T, using closure: (inout T) throws -> Void) rethrows -> T {
    var value = value
    try closure(&value)
    return value
  }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

我尝试通过添加使标签和按钮具有相同的高度publishedDateLabel.heightAnchor.constraint(equalTo: nameButton.heightAnchor)

然而,这并没有改变对齐方式。

我也尝试使用publishedDateLabel.lastBaselineAnchor.constraint(equalTo: nameButton.lastBaselineAnchor) 对齐锚但是这对齐了元素的顶部

使用低音线

如何将按钮中的文本底部与标签中文本的底部对齐?

标签: iosswiftuibuttonautolayoutuilabel

解决方案


只需注释掉heightAnchor使用lastBaselineAnchor

NSLayoutConstraint.activate([
      nameButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
      nameButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8),

      publishedDateLabel.lastBaselineAnchor.constraint(equalTo: nameButton.lastBaselineAnchor),
      publishedDateLabel.leadingAnchor.constraint(equalTo: nameButton.trailingAnchor),
      publishedDateLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8)
    ])

现场操场视图


推荐阅读