Добавление ограничений в метод awakeFromNib()

#swift #uiscrollview #constraints #interface-builder #nslayoutconstraint

#swift #uiscrollview #ограничения #конструктор интерфейса #nslayoutconstraint

Вопрос:

У меня есть два пользовательских представления в моем проекте, которые необходимо увеличить в точно такой же пропорции. Поэтому я решил использовать UIScrollView для этого, и он идеально подходит.

Я решил разработать очень простой класс, унаследованный от UIScrollView, и внутри него я инициализировал всю структуру представлений. Таким образом, я избегаю любых шагов построения в файле NIB, и мой класс можно использовать, просто добавив одно представление. Но я столкнулся с проблемой уже на этапе добавления contentView.

Вот мой класс:

 final class PlayerContentView: UIScrollView {
    fileprivate var contentView: UIView!

    override func awakeFromNib() {
        super.awakeFromNib()

        self.backgroundColor = .clear
        setupScrollProperties()

        setupContentView()
    }

    private func setupScrollProperties()
    {
        self.translatesAutoresizingMaskIntoConstraints = false
        self.minimumZoomScale = 1.0
        self.maximumZoomScale = 2.0
        self.contentSize = frame.size
        self.delegate = self
    }

    private func setupContentView()
    {
        contentView = UIView(frame: self.frame)
        contentView.backgroundColor = .red
        self.addSubview(contentView)

        CommonSwiftUtility.setSideConstraints(superview: self, view: contentView)
        CommonSwiftUtility.setSizeConstraints(superview: self, view: contentView)
    }


    func requireToFail(_ gestureRecognizer: UIPanGestureRecognizer) {
        self.panGestureRecognizer.require(toFail: gestureRecognizer)
    } }
  

И вот методы для добавления ограничений:

 static func setSideConstraints(superview: UIView, view: UIView) {
        let topConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
                                                                   attribute: .top,
                                                                   relatedBy: .equal,
                                                                   toItem: superview,
                                                                   attribute: .top,
                                                                   multiplier: 1.0, constant: 0.0)

        let bottomConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
                                                                      attribute: .bottom,
                                                                      relatedBy: .equal,
                                                                      toItem: superview,
                                                                      attribute: .bottom,
                                                                      multiplier: 1.0, constant: 0.0)

        let leadingConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
                                                                       attribute: .leading,
                                                                       relatedBy: .equal,
                                                                       toItem: superview,
                                                                       attribute: .leading,
                                                                       multiplier: 1.0, constant: 0.0)

        let trailingConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
                                                                        attribute: .trailing,
                                                                        relatedBy: .equal,
                                                                        toItem: superview,
                                                                        attribute: .trailing,
                                                                        multiplier: 1.0, constant: 0.0)

        superview.addConstraint(topConstraint)
        superview.addConstraint(bottomConstraint)
        superview.addConstraint(leadingConstraint)
        superview.addConstraint(trailingConstraint)
    }

    static func setSizeConstraints(superview: UIView, view: UIView)
    {
        let wConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
                                                                 attribute: .width,
                                                                 relatedBy: .equal,
                                                                 toItem: superview,
                                                                 attribute: .width,
                                                                 multiplier: 1.0, constant: 0.0)

        let hConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
                                                                 attribute: .height,
                                                                 relatedBy: .equal,
                                                                 toItem: superview,
                                                                 attribute: .height,
                                                                 multiplier: 1.0, constant: 0.0)

        superview.addConstraint(wConstraint)
        superview.addConstraint(hConstraint)
    }
  

Как вы можете видеть, я покрасил свой contentView в красный цвет, чтобы определить его на экране. После показа моего PlayerContentView я получаю это:

введите описание изображения здесь PlayerContentView растянут на весь экран, поэтому я ожидаю, что contentView будет полноразмерным, но, очевидно, это не так. Не мог бы кто-нибудь, пожалуйста, направить меня к решению этой проблемы? Заранее спасибо!

Ответ №1:

Можете ли вы установить

 contentView.translatesAutoresizingMaskIntoConstraints = false
  

Комментарии:

1. Здравствуйте и спасибо за ваш ответ! Как вы можете видеть в setupScrollProperties() методе, я сделал это, но это ничего не изменило 🙁

2. вы устанавливаете его для себя, а не для contentView

3. Вы на 100% правы, сэр! Ваше решение помогло, большое вам спасибо! Но одно замечание: мне нужно установить для каждого отдельного подвида translatesAutoresizingMaskIntoConstraints значение false , чтобы применить ограничения.

4. Да, вы должны обновить это свойство до false, чтобы установить ограничения