我知道在SO和其他地方有很多答案,但是我仍在努力了解如何在我的上下文中应用它。似乎有很多冲突,各种各样的建议使我难以理解所有这一切。
我有一个ViewController,它加载一个UIView,然后将xib文件作为该UIView的子视图加载,如下所示:
VC:
let cardExpanded = CardExpanded(frame: view.frame)
view.addSubview(cardExpanded)
customUIView:
class CardExpanded: UIView {
var cardLeadingAnchor : NSLayoutConstraint?
var cardTrailingAnchor : NSLayoutConstraint?
var cardTopAnchor : NSLayoutConstraint?
var cardBottomAnchor : NSLayoutConstraint?
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
guard let view = Bundle.main.loadNibNamed("CardExpanded", owner: self, options: nil)?.first as? UIView else {
return
}
self.maximizedView(view: view)
}
func maximizedView(view: UIView) {
addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
let topConstraint = NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem:self , attribute: .top, multiplier: 1.0, constant: 20.0)
let bottomConstraint = NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem:self , attribute: .bottom, multiplier: 1.0, constant: -20.0)
let leadingConstraint = NSLayoutConstraint(item: view, attribute: .leading, relatedBy: .equal, toItem:self , attribute: .leading, multiplier: 1.0, constant: 20.0)
let trailingConstraint = NSLayoutConstraint(item: view, attribute: .trailing, relatedBy: .equal, toItem:self , attribute: .trailing, multiplier: 1.0, constant: -20.0)
self.addConstraints([topConstraint, bottomConstraint, leadingConstraint, trailingConstraint])
}
如您所见,我可以进行设置,并显示视图和xib。
但是有很多问题:
1)我现在有一个VC和一个子视图(cardExpanded-我在VC中也有其他视图),然后我现在有cardExpanded的子视图(名为view的xib文件)。这似乎不必要地复杂,我要做的就是将xib文件加载到VC。 (我想稍后对其进行动画处理,似乎没有必要使用中间视图)。
2)我不想像这样直接将xib文件直接添加到ViewController:
guard let view = Bundle.main.loadNibNamed("CardExpanded", owner: self, options: nil)?.first as? UIView else {
return
}
view.addSubview(view)
因为然后我必须在VC内设置约束。我想像我一样用VC加载视图,然后将视图设置为xib文件。
我在这里以及在我的自定义UIView类中尝试执行此操作时都遇到了问题,我无法在视图本身上设置自动约束,因为它们必须被约束到superView,但是显然我无法访问该视图.superView尚未初始化为视图。.
3)如果必须在VC中设置自动布局约束,那么如何重构代码。我在VC atm中有很多约束代码,我想移出那里。显然,我可以将整个VC View重构为VC,但是当我使用mapkit,动画和Geometry库时,我担心这会带来很多问题,使收益最小。 (不确定)
所以我的问题是: 1)我可以删除中间的UIView并直接从xib文件创建UIView吗? 2)我是否可以在初始化或其他方式从UIView设置对ViewController的自动约束 3)如果必须在ViewController中使用自动布局,如何重构它以保持可读性?
谢谢