首页 > 解决方案 > 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))
    }

标签: iosswiftuibuttonstoryboard

解决方案


正确bounds的是里面viewDidLayoutSubviews不是viewDidLoad

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

推荐阅读