Использовать якорь от следующего верхнего объекта - PullRequest
0 голосов
/ 20 сентября 2018

В данный момент я кодирую Событие - UIViewController, в котором три UITableViews отображают участников, интересующихся и людей, которые не могут прийти.Каждый из них закреплен прямо под ярлыком.Иерархия выглядит следующим образом:

descriptionLabel |surePeopleLabel |surePeopleTV |maybePeopleLabel |maybePeopleTV |nopePeopleLabel |nopePeopleTV

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

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

Кто-нибудь знает (плавный) подход для установки привязки к следующему существующему верхнему объекту?Я добавил свой код, хотя в этом нет необходимости ..

if let sureUsers = surePeopleTV.users, !sureUsers.isEmpty {
    scrollView.addSubview(surePeopleLabel)
    scrollView.addSubview(surePeopleTV)
    let sureTVHeight: CGFloat = CGFloat(sureUsers.count) * 60
    surePeopleLabel.anchor(top: descLabel.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 20, paddingLeft: padding, paddingBottom: 0, paddingRight: padding, width: 0, height: 0)
    surePeopleTV.anchor(top: surePeopleLabel.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 5, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: sureTVHeight)
}

if let maybeUsers = maybePeopleTV.users, !maybeUsers.isEmpty {
    scrollView.addSubview(maybePeopleLabel)
    scrollView.addSubview(maybePeopleTV)
    let maybeTVHeight: CGFloat = CGFloat(maybeUsers.count) * 60
    maybePeopleLabel.anchor(top: surePeopleTV.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 20, paddingLeft: padding, paddingBottom: 0, paddingRight: padding, width: 0, height: 0)
    maybePeopleTV.anchor(top: maybePeopleLabel.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 5, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: maybeTVHeight)
}

if let nopeUsers = nopePeopleTV.users, !nopeUsers.isEmpty {
    scrollView.addSubview(nopePeopleLabel)
    scrollView.addSubview(nopePeopleTV)
    let nopeTVHeight: CGFloat = CGFloat(nopeUsers.count) * 60
    nopePeopleLabel.anchor(top: maybePeopleLabel.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 20, paddingLeft: padding, paddingBottom: 0, paddingRight: padding, width: 0, height: 0)
    nopePeopleTV.anchor(top: nopePeopleLabel.bottomAnchor, left: view.leftAnchor, bottom: scrollView.bottomAnchor, right: view.rightAnchor, paddingTop: 5, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: nopeTVHeight)
}

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вы переосмыслили это.

Не удаляйте никакие объекты (ярлыки или табличные представления).Вместо этого просто измените их высоту (и промежуточные ограничения расстояния) на ноль.На самом деле это проще всего, если каждая пара меток-таблиц находится внутри суперпредставления, которое затем можно отрегулировать по мере необходимости.

В качестве альтернативы используйте представление стека.Он автоматически работает с представлениями, когда вы прячете и отображаете их, настраивая ограничения для вас.

0 голосов
/ 20 сентября 2018
var lowestObjAnchor: NSLayoutYAxisAnchor = descLabel.bottomAnchor

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

if let sureUsers = surePeopleTV.users, !sureUsers.isEmpty {
    scrollView.addSubview(surePeopleLabel)
    scrollView.addSubview(surePeopleTV)
    let sureTVHeight: CGFloat = CGFloat(sureUsers.count) * 60
    surePeopleLabel.anchor(top: lowestObjAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 20, paddingLeft: padding, paddingBottom: 0, paddingRight: padding, width: 0, height: 0)
    surePeopleTV.anchor(top: surePeopleLabel.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 5, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: sureTVHeight)

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