【问题标题】:Setting corner radius through viewDidAppear() or viewWillLayoutSubviews()?通过 viewDidAppear() 或 viewWillLayoutSubviews() 设置角半径?
【发布时间】:2023-03-18 08:47:01
【问题描述】:

总之,通过在 viewWillLayoutSubviews() 中抓取按钮边界并将高度除以 2,为我的应用程序中的 UIButtons 设置角半径以使左右边缘变圆。但是,如果我通过 UIBarButtonItem() 导航到另一个屏幕,旋转设备,然后使用 UIButtons() 导航回屏幕,它们不是圆形的。角半径仍然基于先前方向的按钮尺寸。我尝试使用 viewDidAppear,但在设置角半径时有第二个/明显的延迟。

有没有办法加快 viewDidAppear 的进程?我认为 viewWillAppear 不会起作用,因为视图控制器不知道我正在更改的 uibutton(s) 的默认(方形)尺寸。

我正在开发的应用是这样的:

Screenshots of my current application from loading screen to the point of the corner radius not being updated correctly

【问题讨论】:

    标签: swift uibutton rounded-corners cornerradius


    【解决方案1】:

    请改用viewDidLayoutSubviews,因为此时您将拥有更新的边界,但viewWillLayoutSubviews 中还没有。

    或者我可能建议有一个按钮子类在它自己的layoutSubviews 内进行舍入,从而使您的视图控制器不必遍历按钮并舍入它们。

    例如:

    @IBDesignable
    class RoundedButton: UIButton {
    
        override func layoutSubviews() {
            super.layoutSubviews()
    
            let radius = min(bounds.width, bounds.height) / 2
            layer.cornerRadius = radius
        }
    
    }
    

    然后只使用这个类而不是UIButton。这会产生:

    【讨论】:

    • 我尝试使用 viewDidLayoutSubviews 仍然不成功。我将很快尝试在这里查看 layoutSubviews。再次感谢您的帮助!
    • 甜蜜!这解决了这个问题的答案!但是,我在 UIButton flash 动画的扩展中实现了该方法。你知道为什么在扩展中调用 layoutSubviews 会删除我所有的 setAttributedTitle 吗?
    • 我的 setAttributedTitles 是在 viewDidLoad 中设置的,但是当我实现 UIButton.layoutSubviews() 时,标题不会显示。
    • 您真的不应该在基类的扩展中覆盖任何方法(例如layoutSubviews)。你真的不想改变一个类的行为。如果你在子类中这样做,你不应该看到这种行为。
    • 好的,所以我需要对它进行子类化而不是将其实现到扩展中?我应该指出,我对 Swift 和一般编程仍然相对较新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多