使用笔尖加载自定义视图会导致约束被删除
Loading a custom view with a nib causes constraints being removed
概览
我创建了一个自定义视图 class 和一个关联的笔尖。当我尝试在另一个视图控制器中加载它时,它加载了它但约束被删除了。
我发现了什么
在将其标记为重复之前... 我在 Whosebug 上阅读了很多有相同问题的人的问题,但 swift 中的问题要么没有得到解答,要么无法正常工作。我什么都试过了。
我在做什么
我有一个视图控制器(恰好是一个 keyboardviewcntroller,但在常规控制器上我仍然有问题)和一个关联的笔尖和一个自定义的 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(我的新 class)。在笔尖中,我放置了一个按钮和一个标签,如下图所示,并添加了一些约束。
在 Custom class 中,我放置了以下代码,其中包括 outlets 和 class. 的初始化
@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 而不会弄乱我的约束?
您的约束未按预期工作的原因是因为在 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)
}
}
概览
我创建了一个自定义视图 class 和一个关联的笔尖。当我尝试在另一个视图控制器中加载它时,它加载了它但约束被删除了。
我发现了什么
在将其标记为重复之前... 我在 Whosebug 上阅读了很多有相同问题的人的问题,但 swift 中的问题要么没有得到解答,要么无法正常工作。我什么都试过了。
我在做什么
我有一个视图控制器(恰好是一个 keyboardviewcntroller,但在常规控制器上我仍然有问题)和一个关联的笔尖和一个自定义的 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(我的新 class)。在笔尖中,我放置了一个按钮和一个标签,如下图所示,并添加了一些约束。
在 Custom class 中,我放置了以下代码,其中包括 outlets 和 class. 的初始化
@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 而不会弄乱我的约束?
您的约束未按预期工作的原因是因为在 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)
}
}