добавление ведущих / главных ограничений программно - PullRequest
0 голосов
/ 07 марта 2019

У меня есть следующий код, работающий для ограничений высоты и ширины.Сбой при попытке добавить ведущее ограничение и верхнее ограничение.У меня есть другие наборы кнопок, которые имеют ограничения по высоте, ширине, лидирующим, верхним ограничениям, но все они были настроены на раскадровке, поэтому я считаю, что это единственные 4 ограничения, которые я ДОЛЖЕН добавить к каждой кнопке.

У меня есть7 кнопок, каждая на день недели.Когда я добавляю код для ограничения сверху и снизу, он разрывается с кодом ошибки ниже.Он отлично работает только с высотой / шириной.Я предполагаю, что это связано с тем, как я добавляю подпредставления или отношения кнопок к контроллеру представления ИЛИ при выполнении программно мне нужно больше, чем 4 ограничения (ведущий, верхний, ширина, высота), которые я использовална раскадровке.

СПАСИБО за понимание

    func setupWeekdayButtons() {
    self.weeklyButtons = [self.mondayButton, self.tuesdayButton, self.wednesdayButton, self.thursdayButton, self.fridayButton, self.saturdayButton, self.sundayButton]


    for i in 0...6 {
        print(i)

        self.weeklyButtons[i].translatesAutoresizingMaskIntoConstraints = false
        self.weeklyButtons[i].setTitle(self.weekdayLabels[i], for: .normal)
        self.weeklyButtons[i].layer.borderColor = UIColor.black.cgColor
        self.weeklyButtons[i].titleLabel?.textAlignment = .center
        self.weeklyButtons[i].layer.borderWidth = 1.0
        self.weeklyButtons[i].layer.cornerRadius = 6.0
        self.weeklyButtons[i].setTitleColor(.black, for: .normal)
        self.weeklyButtons[i].setTitleColor(.red, for: .selected)
        self.weeklyButtons[i].addTarget(self, action: #selector(selectedDailyButton), for: .touchUpInside)
        self.view.addSubview(self.weeklyButtons[i])

        let heightConstraint = NSLayoutConstraint(
            item: self.weeklyButtons[i],
            attribute: NSLayoutConstraint.Attribute.height,
            relatedBy: NSLayoutConstraint.Relation.equal,
            toItem: nil,
            attribute: NSLayoutConstraint.Attribute.notAnAttribute,
            multiplier: 1.0,
            constant: 30
        )
        let widthConstraint = NSLayoutConstraint(
            item: self.weeklyButtons[i],
            attribute: NSLayoutConstraint.Attribute.width,
            relatedBy: NSLayoutConstraint.Relation.equal,
            toItem: nil,
            attribute: NSLayoutConstraint.Attribute.notAnAttribute,
            multiplier: 1.0,
            constant: 30
        )
        let leadingConstraint = NSLayoutConstraint(
            item: self.weeklyButtons[i],
            attribute: NSLayoutConstraint.Attribute.leading,
            relatedBy: NSLayoutConstraint.Relation.equal,
            toItem: self.view,
            attribute: NSLayoutConstraint.Attribute.leading,
            multiplier: 1.0,
            constant: 100
        )

        let topConstraint = NSLayoutConstraint(
            item: self.weeklyButtons[i],
            attribute: NSLayoutConstraint.Attribute.top,
            relatedBy: NSLayoutConstraint.Relation.equal,
            toItem: self.view,
            attribute: NSLayoutConstraint.Attribute.top,
            multiplier: 1.0,
            constant: 100
        )
        self.weeklyButtons[i].addConstraint(heightConstraint)
        self.weeklyButtons[i].addConstraint(widthConstraint)
        self.weeklyButtons[i].addConstraint(leadingConstraint)
        self.weeklyButtons[i].addConstraint(topConstraint)


    }
}

2019-03-07 14: 38: 59.176638-0500 Ежедневно [27852: 1408014] [LayoutConstraints] Иерархия представления не подготовленадля ограничения: при добавлении в представление элементы ограничения должны быть потомками этого представления (или самого представления).Это приведет к сбою, если необходимо разрешить ограничение до того, как будет собрана иерархия представлений.Перерыв на - [UIView (UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] для отладки.

2019-03-07 14: 38: 59.177816-0500 Ежедневно [27852: 1408014] [LayoutConstraints] Просмотр иерархии, неподготовленной для ограничения.Ограничение: иерархия контейнеров:> |> Представление не найдено в иерархии контейнеров:> Супервизор этого представления: НЕТ SUPERVIEW

2019-03-07 14: 38: 59.192176-0500 Ежедневно [27852: 1408014] *** Завершение работы приложения из-за неисследованного исключения 'NSGenericException'Причина:' Невозможно установить ограничение на просмотр.Ссылка ссылается на что-то извне поддерева представления?Это незаконно.ограничение: view:> '

Ответы [ 2 ]

0 голосов
/ 07 марта 2019
        self.weeklyButtons[i].addConstraint(leadingConstraint)

Ограничение включает weeklyButtons[i] и self.view.Если вы используете addConstraint для активации ограничения, вы должны добавить ограничение к общему предку двух представлений.Вот что говорит это сообщение об ошибке:

При добавлении к представлению элементы ограничения должны быть потомками этого представления (или самого представления).

Поскольку self.view является супервизором weeklyButtons[i], он считается общим предком двух представлений.Так что в этом случае вы можете добавить ограничение к self.view:

self.view.addConstraint(leadingConstraint)

Но не делайте этого. Начиная с iOS 8, вы можете активировать ограничение напрямую, и UIKitдобавит его в правильный вид автоматически:

leadingConstraint.isActive = true

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

NSLayoutConstraint.activate([
    leadingConstraint,
    topConstraint,
    widthConstraint,
    heightConstraint])

Но не делайте этого. Начиная с iOS 9, появился гораздо более читаемый способ создания ограничений:

NSLayoutConstraint.activate([
    self.weeklyButtons[i].heightAnchor.constraint(equalToConstant: 30),
    self.weeklyButtons[i].widthAnchor.constraint(equalToConstant: 30),
    self.weeklyButtons[i].leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 100),
    self.weeklyButtons[i].topAnchor.constraint(equalTo: view.topAnchor, constant: 100),
    ])

Но не делайте этого. Используйте for / in цикл вместо индексной переменной i:

func setupWeekdayButtons() {
    weeklyButtons = [mondayButton, tuesdayButton, wednesdayButton, thursdayButton, fridayButton, saturdayButton, sundayButton]

    for (button, title) in zip(weeklyButtons, weekdayLabels) {
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setTitle(title, for: .normal)
        button.layer.borderColor = UIColor.black.cgColor
        button.titleLabel?.textAlignment = .center
        button.layer.borderWidth = 1.0
        button.layer.cornerRadius = 6.0
        button.setTitleColor(.black, for: .normal)
        button.setTitleColor(.red, for: .selected)
        button.addTarget(self, action: #selector(selectedDailyButton), for: .touchUpInside)
        view.addSubview(button)

        NSLayoutConstraint.activate([
            button.heightAnchor.constraint(equalToConstant: 30),
            button.widthAnchor.constraint(equalToConstant: 30),
            button.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 100),
            button.topAnchor.constraint(equalTo: view.topAnchor, constant: 100),
            ])
    }
}

Сделайте это.

0 голосов
/ 07 марта 2019

Прошло много времени с тех пор, как я добавил ограничения в код, но если память служит, вы должны добавить представления в иерархию представлений перед добавлением ограничений.(Это то, что предлагает сообщение об ошибке.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...