【问题标题】:Loading a custom view with a nib causes constraints being removed使用 nib 加载自定义视图会导致约束被删除
【发布时间】:2021-01-11 17:28:10
【问题描述】:

概述
我创建了一个自定义视图类和一个关联的笔尖。当我尝试在另一个视图控制器中加载它时,它会加载它但约束被删除。

我发现了什么
在将其标记为重复之前...我在 StackOverflow 上阅读了很多关于人们遇到相同问题但快速解决问题的问题要么没有回答要么不工作。我什么都试过了。

我在做什么
我有一个带有关联 nib 的视图控制器(它恰好是一个 keyboardviewcntroller,但在常规控制器上我仍然有问题)和一个带有关联 nib 的自定义 uiView。

  • 键盘视图控制器:
    我与我的键盘视图控制器关联了一个 zip 文件。他的文件所有者是 KeyboardViewController。
    在我的 KeyboardViewController 中,我拥有通​​过创建键盘目标获得的基本代码,然后我在 viewDidLoad
    @IBOutlet weak var vieww: Custom!
    之前添加了自定义视图出口 在我的 viewDidLoad 中,我加载了我的笔尖
let nib = UINib(nibName: "nibbb", bundle: nil)
let objects = nib.instantiate(withOwner: self, options: nil)
view = objects[0] as? UIView
  • 自定义视图
    我的自定义视图也有一个相关的笔尖。它的文件所有者是自定义(我的新课程)。在笔尖中,我放置了一个按钮和一个标签,如下图所示,并添加了一些约束。
    在 Custom 类中,我放置了以下代码,其中包括 outlet 和类的 init。
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!
    
    override init(frame: CGRect) {
            super.init(frame: frame)
            commonInit()
        }
        
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            commonInit()
           
        }
        
        private func commonInit(){
            Bundle.main.loadNibNamed("Custom", owner: self, options: nil)
            
            addSubview(label)
            label.frame = self.bounds
           
            label.autoresizingMask = [.flexibleHeight, .flexibleWidth]
            addSubview(button)
            button.frame = self.bounds
           
            button.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        }

}

这是我得到的输出:

当然,这不是我想要的。

问题
如何从另一个视图控制器加载自定义 UIView nib 而不会弄乱我的约束?

【问题讨论】:

    标签: ios swift uiview constraints nib


    【解决方案1】:

    您的约束没有按预期工作的原因是因为在 commonInit 函数中将标签和按钮设置为与视图相同的大小。

    你应该声明一个 UIView 属性,然后替换 commonInit 函数的内容:

    var contentView: UIView!
    
    private func commonInit() {
        if let nib = Bundle.main.loadNibNamed("Custom", owner: self, options:nil)?.first as? UIView {
            contentView = nib
            contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            contentView.frame = bounds
            addSubview(contentView)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 2018-11-09
      • 1970-01-01
      • 2021-03-07
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多