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 在 vi​​ewDidLoad 中的打印似乎与故事板保持相同,但是,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))
    }

正确 boundsviewDidLayoutSubviews 里面而不是 viewDidLoad

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    takePhotoButton.cornerRadius(usingCorners: [.topRight, .bottomRight], cornerRadius: CGSize(size: 5))
}