ios - Swift UIButton 在本地化期间更改大小,但边界数据没有改变
问题描述
我在 UIButton 上使用 UIBezierPath 给它圆角,因为 IOS 没有对特定圆角的原生支持。我从 UIView 扩展,因为我在一些模态视图中也需要这个功能。在大多数情况下,我的解决方案很有效,因为它们主要是图标按钮。
但是,我在本地化过程中注意到,UIButton 的实际大小在运行时会发生变化,但按钮的边界/框架与情节提要中的值保持相同。例如,在英文中,按钮的宽度是 70。在中文中,它是 60,因为字符较短。这导致UIBezierPath被透支(UI最初是用英文设计的)到70,当用户使用中文本地化时(我们没有语言切换,它只是基于IOS系统语言)。
所以在英语中,按钮正确显示。但是根据字符长度切换到其他语言,按钮将保持英语的 70 宽度,因此将显示为过度绘制或绘制不足以留下空白透明间隙。viewDidLoad 中绑定/帧的打印似乎与情节提要保持一致,但是,UI 的实时捕获显示不同的宽度。
UIButton 在情节提要中没有预设的宽度/高度,它是灰色的,所以它取决于文本。
扩展.swift:
extension UIView {
func cornerRadius(usingCorners corners: UIRectCorner, cornerRadius: CGSize) {
let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: cornerRadius)
...not important, no bounds/frame manupulation
}
}
视图控制器.swift:
override func viewDidLoad() {
super.viewDidLoad()
takePhotoButton.cornerRadius(usingCorners: [.topRight, .bottomRight], cornerRadius: CGSize(size: 5))
}
解决方案
正确bounds
的是里面viewDidLayoutSubviews
不是viewDidLoad
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
takePhotoButton.cornerRadius(usingCorners: [.topRight, .bottomRight], cornerRadius: CGSize(size: 5))
}
推荐阅读
- php - RD_KAFKA_PARTITION_UA 在 librdkafka 中是如何工作的?
- node.js - MongoDB 失去智能感知?VSCode
- ios - 在按钮单击时暂停 SFSpeechRecognizer
- python - 具有多个外键的 SQLAlchemy 辅助表
- react-native - 箭头函数内的componentDidMount
- javascript - 在列表中添加和删除项目
- installation - 在 Windows 10 上安装 PyTorch3D 并出现 anaconda 和 pip 失败
- python - SharePoint 中的 Django+SharePlum 和富文本字段
- vb.net - EventHandler 中的全局变量
- php - 在 xampp 中使用 php 5.3.3 for mac catalina (10.15.5 )