получение связанного представления NSLayoutConstraints

Я пытаюсь пройти через ограничения представлений.

Я добавил к view1: верхние, конечные, ведущие и ограничения по высоте.

верхний, конечный и ведущий - к основному представлению ViewControllers.

если я прохожу через ограничения view1, я вижу только ограничение высоты.

for constraint in view1.constraints {
    print(constraint)
}

NSLayoutConstraint: 0x6180000968a0 UIView: 0x7fae6b409dd0.height == 146 (активный)

поэтому я прошел через его ограничения superviews (основное представление ViewControllers) и получил множество ограничений, некоторые из которых связаны с view1.

for constraint in view1.superview?.constraints {
    print(constraint)
}

NSLayoutConstraint: 0x618000096670 H: | - (0) - [UIView: 0x7fae6b409dd0] (активный, имена: '|': UIView: 0x7fae6b40a180)

NSLayoutConstraint: 0x6180000974d0 H: [UIView: 0x7fae6b409dd0] - (0) - | (активные, имена: '|': UIView: 0x7fae6b40a180)

NSLayoutConstraint: 0x618000097520 V: | - (0) - [UIView: 0x7fae6b409dd0] (активный, имена: '|': UIView: 0x7fae6b40a180)

и я получаю еще несколько, о которых я не забочусь.

Итак, моя проблема в том, что я хочу пройти через все ограничения superviews view1 и получить только те, которые с ним связаны.

В этом примере UIView:0x7fae6b409dd0 - это view1.

Но я не могу понять, как получить эту собственность.

Спасибо


Если я распечатаю constraint.firstAnchor, я получу дополнительную информацию, но все равно не могу получить связанный вид.

NSLayoutXAxisAnchor: 0x608000265480 "UIView: 0x7fae6b409dd0.leading">

NSLayoutXAxisAnchor: 0x608000265480 "UIView: 0x7fae6b409dd0.trailing">

NSLayoutXAxisAnchor: 0x608000265480 "UIView: 0x7fae6b409dd0.top">


person ilan    schedule 04.01.2017    source источник
comment
Фильтр с использованием свойств firstItem и secondItem класса NSLayoutConstraint.   -  person Naresh Reddy M    schedule 04.01.2017
comment
@NareshReddyM Как мне получить с него вид? первый / второй элемент - AnyObject   -  person ilan    schedule 04.01.2017
comment
Проверьте первый ответ этой ветки stackoverflow.com/questions / 25045796 /   -  person Naresh Reddy M    schedule 04.01.2017
comment
Спасибо, constraint.firstItem.isDescendant (of: view1), это сработало для меня из: themainthread.com/blog/2013/05/   -  person ilan    schedule 04.01.2017


Ответы (2)


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

Затем вы можете использовать оператор ===, чтобы сравнить, является ли это одним и тем же объектом:

let constraints = view1.superview!.constraints
var count = 0

print("superview has \(constraints.count) constraints")

for constraint in constraints {
    if constraint.firstItem === view1 {
        count += 1
        print(constraint)
    } else if let secondItem = constraint.secondItem, secondItem === view1 {
        count += 1
        print(constraint)
    }
}

print("\(count) of them relate to view1")
person vacawama    schedule 04.01.2017

Простой способ - сравнить, существует ли хэш-код представления в объекте ограничения:

[[NSString stringWithFormat:@"%@", constraint] containsString:[NSString stringWithFormat:@"%x", view.hash]]
person Shrdi    schedule 28.12.2019