斯威夫特:圆角在首次出现时再次出现并再现

时间:2017-11-30 18:07:57

标签: ios swift

class ApplyCorners: UIButton {
override func didMoveToWindow() {
    self.layer.cornerRadius = self.frame.height / 2
}
}

我将此类应用于我的应用程序中的按钮,它工作得很好,但是当我将它应用于表格视图中每个单元格中使用的按钮时,按钮角落在进入视图时不会圆,但是如果我单击我被其他视图所吸引的按钮之一。如果我然后向后移动角落是"固定" / round。

绿色是返回时的按钮,红色是在第一次进入视图时。

Image

任何人都知道如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

我建议layoutSubviews,只要按钮的frame发生变化就会捕获:

class ApplyCorners: UIButton {

    override func layoutSubviews() {
        super.layoutSubviews()
        layer.cornerRadius = frame.height / 2
    }

}

这将照顾原始外观和任何后续外观。它还避免了各种问题,不仅与视图出现时是否知道frame有关,而且还有任何可能改变按钮大小的事情(例如与约束,旋转事件等相关的事情) )。

答案 1 :(得分:1)

这种事情很可能是一个时间问题。考虑一下self.frame.height这个短语。在调用didMoveToWindow时,我们可能尚未知道我们的框架。如果要调用依赖于布局的方法,请在布局实际发生时执行此操作。

答案 2 :(得分:1)

提出另一种选择:听取任何边界变化。这可以避免在调用此框架时出现问题"我的框架设置?"

class ApplyCorners: UIButton {

    override var bounds: CGRect {
        didSet {
            layer.cornerRadius = bounds.height / 2
        }
    }

}

编辑framebounds,因为正如@Rob指出的那样,监听帧更改会导致您有时错过初始加载。

答案 3 :(得分:0)

将代码放在didMoveToWindow()中对我没有意义。我建议改为实施layoutSubviews()。每当视图对象的布局发生变化时,都会调用该方法,因此如果您调整视图大小,它就会更新。

(根据TNguyen和Rob的评论改变了我的建议。)