Swift UIButton 在本地化期间更改大小但边界数据未更改
Swift UIButton changes size during localization but the bounds data doesn't get changed
我在 UIButton 上使用 UIBezierPath 来给它圆角,因为 IOS 没有对特定圆角的原生支持。我从 UIView 扩展,因为我在某些模态视图中也需要此功能。在大多数情况下,我的解决方案之所以有效,是因为它们大多是图标按钮。
但是,我在本地化过程中注意到,UIButton 的实际大小在运行时会发生变化,但按钮的 bounds/frame 与 Storyboard 中的值保持不变。例如,在英文中,按钮的宽度为 70。在中文中,它是 60,因为字符较短。这导致 UIBezierPath 被透支(UI 最初是英文设计的)到 70,当用户使用中文本地化时(我们没有语言切换,它只是基于 IOS 系统语言).
所以在英语中,按钮显示正确。但根据字符长度切换到其他语言,按钮将保持在英文的 70 宽度,因此将显示为 over draw 或 under draw 以留出空白透明间隙。 bound/frame 在 viewDidLoad 中的打印似乎与故事板保持相同,但是,UI 的实时捕获显示不同的宽度。
UI按钮在故事板中没有预设 width/height,它是灰色的,因此取决于文本。
Extension.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
}
}
viewController.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))
}
我在 UIButton 上使用 UIBezierPath 来给它圆角,因为 IOS 没有对特定圆角的原生支持。我从 UIView 扩展,因为我在某些模态视图中也需要此功能。在大多数情况下,我的解决方案之所以有效,是因为它们大多是图标按钮。
但是,我在本地化过程中注意到,UIButton 的实际大小在运行时会发生变化,但按钮的 bounds/frame 与 Storyboard 中的值保持不变。例如,在英文中,按钮的宽度为 70。在中文中,它是 60,因为字符较短。这导致 UIBezierPath 被透支(UI 最初是英文设计的)到 70,当用户使用中文本地化时(我们没有语言切换,它只是基于 IOS 系统语言).
所以在英语中,按钮显示正确。但根据字符长度切换到其他语言,按钮将保持在英文的 70 宽度,因此将显示为 over draw 或 under draw 以留出空白透明间隙。 bound/frame 在 viewDidLoad 中的打印似乎与故事板保持相同,但是,UI 的实时捕获显示不同的宽度。
UI按钮在故事板中没有预设 width/height,它是灰色的,因此取决于文本。
Extension.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
}
}
viewController.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))
}