如何转换 uilabel 保持其 x 位置相同并缩放以减小字体大小

How to transform uilabel keeping its x position same and scale to reduce the font size

我实现了一个导航 header (uiview),它在向上滚动 tablview 时缩小,在向下滚动时扩大。与个人资料页面中的 ubers ios app header 完全相同。我可以在从底部滚动到右上角时更改标签位置,但是如何在滚动时降低字体大小。如果我动态地改变字体大小,它就会抖动。如果我使用变换比例,那么我无法确定我需要缩放标签以达到特定字体大小的数量。当较大的 uialabel x 位置为 15 且字体大小为 24 时,当折叠时 x 位置将为 45 且字体大小为 20。任何潜在客户将不胜感激。

func updateHeader() {
    let range = maximumHeaderHeight - minimumHeaderHeight
    let openAmount = headerHeightConstraint.constant - maximumHeaderHeight
    let percentage = openAmount / range
    headerLabelLeadingConstraint.constant = labelXPositionOfAnimationHeader - (openAmount)}

查看 header 并设置 6 个约束条件(因此我们的 header 的最大高度将为 100,最小高度将为 50)

  1. 高度 == 100(优先级:750)(为此约束创建 IBOutlet)
  2. 身高 <= 100(优先级:1000)
  3. 身高>=50(优先级:1000)
  4. 尾随 == 0
  5. 前导 == 0
  6. Top == 0 (从状态栏连接)

在里面添加标签 header 查看并设置 4 个约束条件

  1. 顶部 == 0
  2. 前导 == 0
  3. 尾随 == 0
  4. 底部 == 0

添加 Table 视图并设置 4 个约束条件

  1. Top == 0 (从状态栏连接)
  2. 前导 == 0
  3. 尾随 == 0
  4. 底部 == 0

ViewController

class ViewController: UIViewController, UIScrollViewDelegate, UITableViewDelegate, UITableViewDataSource
{
    @IBOutlet weak var tableView : UITableView? = nil
    @IBOutlet weak var headerView : UIView? = nil
    @IBOutlet weak var headerLabel : UILabel? = nil
    @IBOutlet weak var headerHeightConstraint : NSLayoutConstraint? = nil
    private var headerHeight : CGFloat = 100
    private var topInset : CGFloat = 100 // TopInset == headerHeight
    private var maxFontSize : CGFloat = 32 


    override func viewDidLoad()
    {
        super.viewDidLoad()

        // TopInset == headerHeight
        tableView?.contentInset = UIEdgeInsets(top: topInset, left: 0, bottom: 0, right: 0)
    }

    func numberOfSections(in tableView: UITableView) -> Int
    {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 5
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

        return 100.0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = UITableViewCell()
        cell.textLabel?.text = "\(indexPath.row)"
        return cell
    }

    func scrollViewDidScroll(_ scrollView: UIScrollView)
    {
        let y = scrollView.contentOffset.y + topInset
        headerHeightConstraint?.constant = headerHeight - y

        let fontSize = (maxFontSize * (headerView?.frame.height ?? 0))/(headerHeight)
        headerLabel?.font = UIFont.systemFont(ofSize: fontSize)
    }
}