如何转换 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)
- 高度 == 100(优先级:750)(为此约束创建 IBOutlet)
- 身高 <= 100(优先级:1000)
- 身高>=50(优先级:1000)
- 尾随 == 0
- 前导 == 0
- Top == 0 (从状态栏连接)
在里面添加标签 header 查看并设置 4 个约束条件
- 顶部 == 0
- 前导 == 0
- 尾随 == 0
- 底部 == 0
添加 Table 视图并设置 4 个约束条件
- Top == 0 (从状态栏连接)
- 前导 == 0
- 尾随 == 0
- 底部 == 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)
}
}
我实现了一个导航 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)
- 高度 == 100(优先级:750)(为此约束创建 IBOutlet)
- 身高 <= 100(优先级:1000)
- 身高>=50(优先级:1000)
- 尾随 == 0
- 前导 == 0
- Top == 0 (从状态栏连接)
在里面添加标签 header 查看并设置 4 个约束条件
- 顶部 == 0
- 前导 == 0
- 尾随 == 0
- 底部 == 0
添加 Table 视图并设置 4 个约束条件
- Top == 0 (从状态栏连接)
- 前导 == 0
- 尾随 == 0
- 底部 == 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)
}
}