class ApplyCorners: UIButton {
override func didMoveToWindow() {
self.layer.cornerRadius = self.frame.height / 2
}
}
我将此类应用于我的应用程序中的按钮,它工作得很好,但是当我将它应用于表格视图中每个单元格中使用的按钮时,按钮角落在进入视图时不会圆,但是如果我单击我被其他视图所吸引的按钮之一。如果我然后向后移动角落是"固定" / round。
绿色是返回时的按钮,红色是在第一次进入视图时。
任何人都知道如何解决这个问题?
答案 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
}
}
}
编辑frame
到bounds
,因为正如@Rob指出的那样,监听帧更改会导致您有时错过初始加载。
答案 3 :(得分:0)
将代码放在didMoveToWindow()
中对我没有意义。我建议改为实施layoutSubviews()
。每当视图对象的布局发生变化时,都会调用该方法,因此如果您调整视图大小,它就会更新。
(根据TNguyen和Rob的评论改变了我的建议。)