首页 > 解决方案 > 如何转换uilabel保持其x位置相同并缩放以减小字体大小

问题描述

我实现了一个导航标题(uiview),它在向上滚动 tablview 时缩小,向下滚动时展开。与个人资料页面中的 ubers ios 应用标题完全相同。我可以在从右下角滚动到右上角时更改标签位置,但是如何降低滚动时的字体大小。如果我动态更改字体大小,它会抽搐。如果我使用变换比例,那么我无法计算出我需要缩放标签以实现特定字体大小的数量。当较大的 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)}

标签: iosswiftcore-animation

解决方案


查看标题并设置 6 个约束(因此标题的最大高度为 100,最小高度为 50)

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

在标题视图中添加标签并设置 4 个约束

  1. 顶部 == 0
  2. 领先 == 0
  3. 尾随 == 0
  4. 底部 == 0

添加表格视图并设置 4 个约束

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

视图控制器

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)
    }
}

在此处输入图像描述


推荐阅读