swift - 如何在 UIBarButtonItem 的字体粗细发生变化时修复其大小
问题描述
下面是从我的项目中提取的一小段演示代码。它由一个 UINavigationBar、UINavigationItem 和几个 UIBarButtonItems 组成。点击 barButtonItem 会突出显示它并使其他变暗。这样做,字体大小发生变化是可以理解的,但我希望 barButtonItems 本身的大小是固定的。这样,当我随机点击 barButtonItems 时,它们似乎不会随着标题文本的收缩和扩展而抖动。如何使 barButtonItems 在标题文本更改时抵抗调整大小?
import UIKit
class ViewController: UIViewController {
var barButtonItems: [UIBarButtonItem]!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .darkGray
let navBar: UINavigationBar = UINavigationBar(frame: CGRect(x: 0, y: 100, width: view.frame.width, height: 40))
navBar.barTintColor = #colorLiteral(red: 0.1019607857, green: 0.2784313858, blue: 0.400000006, alpha: 1)
view.addSubview(navBar)
let navItem = UINavigationItem()
let appleBarBtnItem = UIBarButtonItem(title: "Apple", style: .plain, target: self, action: #selector(barItemTapped))
let bananaBarBtnItem = UIBarButtonItem(title: "Banana", style: .plain, target: self, action: #selector(barItemTapped))
let kiwiBarBtnItem = UIBarButtonItem(title: "Kiwi", style: .plain, target: self, action: #selector(barItemTapped))
let pearBarBtnItem = UIBarButtonItem(title: "Pear", style: .plain, target: self, action: #selector(barItemTapped))
let orangeBarBtnItem = UIBarButtonItem(title: "Orange", style: .plain, target: self, action: #selector(barItemTapped))
barButtonItems = [appleBarBtnItem, bananaBarBtnItem, kiwiBarBtnItem, pearBarBtnItem, orangeBarBtnItem]
navItem.leftBarButtonItems = barButtonItems
navBar.setItems([navItem], animated: false)
setCurrentBarItem(appleBarBtnItem)
}
func setCurrentBarItem(_ barBtnItem: UIBarButtonItem) {
for btn in barButtonItems {
highlight(btn, turnedOn: (btn == barBtnItem) )
}
}
func highlight(_ button: UIBarButtonItem, turnedOn: Bool) {
button.tintColor = #colorLiteral(red: 0.7230747342, green: 0.9554787278, blue: 0.9893732667, alpha: 1)
let weight: UIFont.Weight = turnedOn ? .bold : .thin
let attributes: [NSAttributedString.Key : Any] = [ .font: UIFont.systemFont(ofSize: 20, weight: weight)]
button.setTitleTextAttributes(attributes, for: .normal)
}
@objc func barItemTapped(_ sender: UIBarButtonItem) {
setCurrentBarItem(sender)
}
}
解决方案
看起来我必须放弃.bold
为选定的 barButtonItem 设置.thin
字体粗细,如果不是,则放弃设置字体粗细,因为字体粗细的变化会扩大或缩小 barButtonItem 的宽度,导致并列的 barButtonItems 在我点击时移动和晃动在他们。我最终决定只改变 barButtonItems 的颜色并提供一个简单的动画:
func highlight(_ button: UIBarButtonItem, turnedOn: Bool) {
let tintColor = turnedOn ?
#colorLiteral(red: 0.7230747342, green: 0.9554787278, blue: 0.9893732667, alpha: 1)
:
#colorLiteral(red: 0.1901655495, green: 0.5488880277, blue: 0.7976593971, alpha: 1)
UIView.animate(withDuration: 0.2,
delay: 0,
options: [.allowUserInteraction, .curveEaseInOut],
animations: { button.tintColor = tintColor },
completion: nil)
}
推荐阅读
- python - 数学运算和比较运算符的类型错误
- node.js - 回调不是函数 - 读取 JSON 文件
- javascript - 具有 gte 条件的 Ramda 过滤数据
- python - 使用预训练模型进行 LogisticRegression() 训练
- windows - 单行嵌套循环
- c - 为什么 mq_timedreceive 忽略 timespec 结构?
- excel - HTMLBody 属性的 VBA Excel 细分
- javascript - 用户点击dismiss(x)或刷新页面后不再显示警报
- flutter - 如何使用按钮的 onPressed 属性将小部件文本的值复制到另一个
- laravel - “npm install”的问题——Laravel-mix