Всегда ли xib-файл должен быть подвидом пользовательского класса UIView?(создание 2 просмотров) - PullRequest
0 голосов
/ 17 мая 2019

Я знаю, что у этого есть много ответов на 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 (файл с именем xib, называемый view). Это кажется излишне сложным, все, что я хочу сделать, это загрузить файл 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, как я сделал, и затем сделать представление САМОГО файла XIB.

Я столкнулся с проблемами здесь, так же как когда я пытался сделать это в своем пользовательском классе UIView, я не мог установить автоограничения на самом представлении, потому что они должны были быть ограничены superView, но, очевидно, я не могу получить доступ к представлению .superView в инициализации, так как представление еще не существует ..

3) Если я должен установить ограничения автопереключения в VC, то как я могу реорганизовать свой код. У меня много кодов ограничений в VC atm, которые я хочу оттуда удалить. Очевидно, я мог бы реорганизовать весь VC View из VC, но когда я использую mapkit, анимацию и библиотеки Geometry, и я волнуюсь, это создаст множество проблем с минимальной выгодой. (я не уверен)

Итак, мои вопросы: 1) Могу ли я удалить промежуточный UIView и создать UIView непосредственно из файла XIB? 2) Могу ли я установить автоограничения для ViewController изнутри UIView, либо при инициализации, либо иным образом 3) Если я должен использовать autolayout во ViewController, как я могу реорганизовать его, чтобы он был читабельным?

Спасибо

...