ios - 如何转换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)}
解决方案
查看标题并设置 6 个约束(因此标题的最大高度为 100,最小高度为 50)
- 高度 == 100(优先级:750)(为此约束创建 IBOutlet)
- 高度 <= 100(优先级:1000)
- 高度 >= 50(优先级:1000)
- 尾随 == 0
- 领先 == 0
- Top == 0 (从状态栏连接)
在标题视图中添加标签并设置 4 个约束
- 顶部 == 0
- 领先 == 0
- 尾随 == 0
- 底部 == 0
添加表格视图并设置 4 个约束
- Top == 0 (从状态栏连接)
- 领先 == 0
- 尾随 == 0
- 底部 == 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)
}
}
推荐阅读
- react-native - KEYCLOAK:redirectUrl:'
:/打回来' - scala - 使用 scala 从 dynamodb 获取表大小
- javascript - 无法从mysql推送到数组结果
- java - 任务链中的 CompletableFuture 错误处理
- javascript - Vue.js 和 Firestore 只更新不等于空字符串的变量
- android - Android Tombstone回溯中符号后的数字是什么?
- javascript - window.postMessage 不工作 JavaScript
- c# - 在 C# 服务中使用 openpop.dll 连接到 Gmail
- javascript - ES6 设置比较并得到重复
- angular - 如何在 Angular 8 jasmine 中测试 catchError 场景,以便覆盖 handleError 方法