是否可以在 UIButton 的子类中设置约束?

Posted

技术标签:

【中文标题】是否可以在 UIButton 的子类中设置约束?【英文标题】:Is it possible to set up constraints in subclass of UIButton? 【发布时间】:2018-11-09 00:09:42 【问题描述】:
class SpecialButton: UIButton 

    init() 
        super.init(frame: .zero)

    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

我想创建一个 UIButton 的自定义按钮子类。我想设置这个按钮的约束。在视图控制器中,我可以使用view.addSubview() 方法并在那里设置button.topAnchor.constraint,但它在这个子类中不起作用。我该如何接近它?还是我试图以错误的方式接近它?我是编码新手,请告诉我。

这是我在类中放入超级视图属性后的代码。我认为它有效并解决了我的问题。有没有更好的解决方案告诉我。

    class SpecialButton: UIButton 

    let superView: UIView

    init(superView: UIView) 
        self.superView = superView
        super.init(frame: .zero)

        superView.addSubview(self)
        self.translatesAutoresizingMaskIntoConstraints = false
        self.topAnchor.constraint(equalTo: superView.topAnchor).isActive = true
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

【问题讨论】:

应该是一样的...贴出视图控制器的代码 发布您尝试过的内容 我不想在视图控制器中设置约束以使其干净。有可能吗? 我在问题中放了一个新的代码块,这是在子类中添加约束的好解决方案吗? 【参考方案1】:

在按钮成为视图层次结构的一部分之前,您不能添加涉及按钮顶部锚点的约束,也就是说,直到它具有超级视图。该按钮知道它何时被添加到超级视图,因为它接收到didMoveToSuperview。这是您可以放置​​约束代码的最早时刻。

【讨论】:

哦,我现在明白了。非常感谢。有没有办法将潜在的超级视图放入按钮子类中? 我在问题中放了一个新的代码块,这是在子类中添加约束的好解决方案吗? 按钮的超级视图,从按钮的角度来看,是self.superview

以上是关于是否可以在 UIButton 的子类中设置约束?的主要内容,如果未能解决你的问题,请参考以下文章

在单元格中设置图标图像的问题

如何向放置在 UIStackView 中的以编程方式创建的 UIButton 添加约束

以编程方式在 UINavigationController 中设置 UINavigationBar 的自定义子类

如何在 Swift 3 中设置 UIButton 的图像?

如何在整个应用程序中设置 UIButton 点击​​声音?

如何在 UITableViewCell 中设置 UIButton 状态?