xib文件是否始终必须是自定义UIView类的子视图? (创建2个视图)

时间:2019-05-17 14:05:38

标签: swift uiview refactoring xib nib

我知道在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中使用自动布局,如何重构它以保持可读性?

谢谢

0 个答案:

没有答案