运行时按钮框架更改

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 方法。

【讨论】:

以上是关于运行时按钮框架更改的主要内容,如果未能解决你的问题,请参考以下文章

WPF在运行方法时更改用户控件中的按钮内容

如何使用 iphone SDK 中的两个按钮在运行时更改应用程序语言?

实体框架在运行时更改连接

UIButton 在运行时更改尺寸

如何在运行时更改 webview 的高度?

在 Swift 运行时更改自动布局约束的 UIView 的框架