Получение ошибки в расширении «Иерархия представления не подготовлена ​​для ограничения» - PullRequest
0 голосов
/ 04 октября 2019

Я добавляю thumbnailMaskView поверх thumbnailImageView, и это работает!

func setupViews() {

    addSubview(thumbnailImageView)
    addSubview(thumbnailMaskView)

    addConstraintsWithFormat(format: "H:|[v0]|", views: thumbnailImageView)
    addConstraintsWithFormat(format: "V:|-16-[v0]-16-|", views: thumbnailImageView)

    addConstraints([NSLayoutConstraint(item: thumbnailMaskView, attribute: .leading, relatedBy: .equal, toItem: thumbnailImageView, attribute: .leading, multiplier: 1, constant: 0)])
    addConstraints([NSLayoutConstraint(item: thumbnailMaskView, attribute: .trailing, relatedBy: .equal, toItem: thumbnailImageView, attribute: .trailing, multiplier: 1, constant: 0)])
    addConstraints([NSLayoutConstraint(item: thumbnailMaskView, attribute: .top, relatedBy: .equal, toItem: thumbnailImageView, attribute: .top, multiplier: 1, constant: 0)])
    addConstraints([NSLayoutConstraint(item: thumbnailMaskView, attribute: .bottom, relatedBy: .equal, toItem: thumbnailImageView, attribute: .bottom, multiplier: 1, constant: 0)])
}

Я пытаюсь извлечь этот код в UIView Extension с помощью следующего кода:

extension UIView {

    func addOnTop(_ topView: UIView) {
        addConstraints([NSLayoutConstraint(item: topView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1, constant: 0)])
        addConstraints([NSLayoutConstraint(item: topView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1, constant: 0)])
        addConstraints([NSLayoutConstraint(item: topView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1, constant: 0)])
        addConstraints([NSLayoutConstraint(item: topView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1, constant: 0)])
    }
}

При использовании функции extension thumbnailImageView.addOnTop(thumbnailMaskView) появляется ошибка:

2019-10-04 14: 19: 13.149081 + 0100 Rich People [1589: 18861] [LayoutConstraints] Представлениеиерархия не подготовлена ​​для ограничения: (неактивно)> При добавлении в представление элементы ограничения должны быть потомками этого представления (или самого представления). Это приведет к сбою, если необходимо разрешить ограничение до того, как будет собрана иерархия представлений. Разбить на - [UIView (UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] для отладки. 2019-10-04 14: 19: 13.152718 + 0100 Богатые люди [1589: 18861] [LayoutConstraints] Просмотр иерархии, неподготовленной к ограничению. Ограничение: Иерархия контейнера:> Представление не найдено в иерархии контейнера:> Суперпредставление этого представления:> 2019-10-04 14: 19: 13.160046 + 0100 Rich People [1589: 18861] *** Завершение работы приложения из-за невыполненного исключения «NSGenericException», причина: «Невозможно установить ограничение на просмотр. Ссылка ссылается на что-то извне поддерева представления? Это незаконно. ограничение: (активно)> просмотр:> '

1 Ответ

0 голосов
/ 04 октября 2019

Чтобы добавить ограничения к представлению, они должны быть для дочернего / дочернего представления, поэтому лучше использовать activate

NSLayoutConstraint.activate([  
    topView.leadingAnchor.constraint(equalTo: self.leadingAnchor), 
    topView.trailingAnchor.constraint(equalTo: self.trailingAnchor), 
    topView.topAnchor.constraint(equalTo: self.topAnchor), 
    topView.bottomAnchor.constraint(equalTo: self.bottomAnchor) 
])

И это добавит ограничения к правильному представлению

...