Могу ли я создать ограничения от инициализации uiview до его superview - PullRequest
0 голосов
/ 17 июня 2019

Я создал много просмотров, что не проблема.Однако у меня есть много кодов ограничений изменений в VC, которые требуют рефакторинга.

ВОПРОС:

Как (если возможно) я могу установить ограничения внутри метода init самого subView, чтобы я могрефакторинг кода из ВК.

Я не могу придумать другой способ сформулировать мой вопрос для Google, поэтому вот что я получил:

VC

    func addCheckView() {
        let checkView = CheckView()
        checkView.frame = self.view.frame
        view.insertSubview(checkView, aboveSubview: mapView)
    }
import UIKit

class CheckView: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }


    private func commonInit() {
        backgroundColor = .blue
//        addSubview(self)
        translatesAutoresizingMaskIntoConstraints = false
//        let margins = layoutMarginsGuide
        leadingAnchor.constraint(equalTo: leadingAnchor, constant: 40).isActive = true
        trailingAnchor.constraint(equalTo: trailingAnchor, constant: -40).isActive = true
        topAnchor.constraint(equalTo: topAnchor, constant: 40).isActive = true
        bottomAnchor.constraint(equalTo: bottomAnchor, constant: -40).isActive = true
//        layoutIfNeeded()
    }
}

Я перепробовал огромное количество вариантов, но, чтобы сохранить его кратким и читабельным (и, поскольку я думаю, что решение довольно простое), я оставлю это здесь.

Очевидно, я мог бы просто сделать что-то вродеэто и передать касания:

private func commonInit() {
let view = CheckView()
// add constraints here, etc.
}

Это работает, но разве это не просто добавление подпредставления в подпредставлении?Это кажется не элегантным и многословным.

1 Ответ

1 голос
/ 17 июня 2019

Вы не можете ограничить представление его суперпредставлением, пока у него не будет суперпредставления.Но init происходит до того, как появляется суперпредставление, поэтому вы не можете переместить в него свой код ограничения.Вместо этого в своем подклассе UIView реализуйте didMoveToSuperview().Теперь self.superview впервые не является nil, и представление может ограничиться своим суперпредставлением.

...