【问题标题】: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

标签: ios swift uibutton


【解决方案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 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多