运行时按钮框架更改
Posted
技术标签:
【中文标题】运行时按钮框架更改【英文标题】:Button frame change at runtime 【发布时间】:2016-08-11 15:50:52 【问题描述】:我有一个UIButton
的子类:
class ColorButton: UIButton
override func awakeFromNib()
self.layer.backgroundColor = UIColor.blackColor().CGColor
self.layer.cornerRadius = frame.size.width / 2
self.clipsToBounds = true
在界面生成器中,我为按钮设置了 4 个约束:width = 100, height = 100, centerX, centerY
。
当我在模拟器上运行我的代码时,该按钮消失。但是,如果它设置了
self.layer.cornerRadius = 50
它有效。我想不明白。如果有人理解这个问题,请告诉我。
【问题讨论】:
您在 awakeNIb 方法中的 frame.size.width 是多少? frame.size.width 打印出来时返回 1000 【参考方案1】:在awakeFromNib
第一行添加:
self.layoutIfNeeded()
代码:
class ColorButton: UIButton
override func awakeFromNib()
self.layoutIfNeeded()
self.layer.backgroundColor = UIColor.blackColor().CGColor
self.layer.cornerRadius = frame.size.width / 2
self.clipsToBounds = true
【讨论】:
或者放到viewDidLayoutSubviews中! 这更糟,因为viewDidLayoutSubviews
可以被多次调用
layoutIfNeeded 讽刺的是在 awakeFromNib 中不需要。
self.layer.cornerRadius = frame.size.width / 2
需要正确的框架
@Igor,对不起,但这不是真的。看我的回答,你可以自己测试,在 5 分钟内创建一个新项目。【参考方案2】:
您的代码在新项目中运行良好,所以我怀疑问题出在其他地方。你忘了打电话给super.awakeFromNib()
。来自Apple docs:
你必须调用 awakeFromNib 的超级实现给 parent 类有机会执行任何额外的初始化,他们 要求。虽然这个方法的默认实现确实 没什么,很多 UIKit 类都提供了非空的实现。你可以 在您自己的任何时候调用超级实现 awakeFromNib 方法。
【讨论】:
以上是关于运行时按钮框架更改的主要内容,如果未能解决你的问题,请参考以下文章