在不创建新视图或知道特定父视图的情况下向 UIButton 类添加约束

Posted

技术标签:

【中文标题】在不创建新视图或知道特定父视图的情况下向 UIButton 类添加约束【英文标题】:Add constraints to a UIButton class without creating new view or knowing specific parent view 【发布时间】:2021-07-13 18:16:59 【问题描述】:

我的应用中有一堆按钮,我想为所有按钮使用同一个类(UIButton)。我需要能够在类中同时更改所有这些约束,其中一些将嵌套在不同的父视图中。它们都是在 Interface Builder 中创建的,它们嵌套在自己的 UIView 中的几个水平和垂直 UIStackViews 中。

这可能吗?

我希望做这样的事情,但我不知道如何更进一步:

class myButtonClass: UIButton 

    required init(coder aDecoder:NSCoder)  super.init(coder: aDecoder)!
    
    override init(frame:CGRect) super.init(frame: frame)
        setConstraints()
    
    
    
    func setConstraints() 
       
        let topMarginConstraint = NSLayoutConstraint(item: .self, attribute: NSLayoutConstraint.Attribute.topMargin, relatedBy: NSLayoutConstraint.Relation, toItem: .superview, attribute: NSLayoutConstraint.Attribute.topMargin, multiplier: 1, constant: 2)
        
        //Additional Constraints
        
        self.addConstraints([topMarginConstraint])

    

由于各种原因这不起作用,其中一些错误是因为我不知道如何将上述分配给未公开的超级视图(父视图)?

【问题讨论】:

【参考方案1】:

我设法通过使用 .superview 自己解决了这个问题:

func setConstraints() 
    
    self.translatesAutoresizingMaskIntoConstraints = false
    
    self.widthAnchor.constraint(equalTo: superview!.widthAnchor, multiplier: 0.8).isActive = true
    self.heightAnchor.constraint(equalTo: superview!.heightAnchor, multiplier: 0.8).isActive = true
    self.centerYAnchor.constraint(equalTo: superview!.centerYAnchor).isActive = true
    self.centerXAnchor.constraint(equalTo: superview!.centerXAnchor).isActive = true

【讨论】:

以上是关于在不创建新视图或知道特定父视图的情况下向 UIButton 类添加约束的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 有没有办法在不覆盖子视图的任何手势的情况下向视图添加手势?

如何在不知道当前/主视图是啥的情况下从后台线程打开新视图?

在不干扰平移的情况下向 MKMapView 添加左滑动手势

如何在不将实例模型添加到数据库的情况下向实体模型添加FK约束?

如何让机器人在不使用命令的情况下向特定频道中的特定公会发送消息

ffmpeg:在不创建新文件的情况下向 mp4 添加字幕