#swift
#swift
Вопрос:
В качестве заголовка у меня есть viewParent, у которого есть ViewA, но ViewA будет заменен ViewB в методе awakeAfter
.
Я хочу преобразовать все ограничения
из viewParent <-> ViewA,
в viewParent <-> ViewB.
Большое спасибо.
Вот мой код:
private func convertConstraints(from: UIView, to: UIView){
from.constraints.forEach { (constraint: NSLayoutConstraint) in
let isFirst = (constraint.firstItem as? UIView) == from
let isSecond = (constraint.secondItem as? UIView) == from
let first: Any = (isFirst) ? to : constraint.firstItem as Any
let second: Any? = (isSecond) ? to : constraint.secondItem as? Any
let new = NSLayoutConstraint(item: first,
attribute: constraint.firstAttribute,
relatedBy: constraint.relation,
toItem: second,
attribute: constraint.secondAttribute,
multiplier: constraint.multiplier,
constant: constraint.constant)
new.priority = constraint.priority
new.identifier = constraint.identifier
new.shouldBeArchived = constraint.shouldBeArchived
new.isActive = constraint.isActive
}
}
И журнал консоли ниже:
2019-03-27 15:36:33.740004 0800 Cale[86571:50392102] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSLayoutConstraint for <Cale.AirportButton: 0x7f9eb454d990; baseClass = UIButton; frame = (0 129; 120 120); autoresize = RM BM; layer = <CALayer: 0x600003936460>>: Unknown layout attribute'
*** First throw call stack:
(
0 CoreFoundation 0x000000010bf501bb __exceptionPreprocess 331
1 libobjc.A.dylib 0x000000010b4ee735 objc_exception_throw 48
2 CoreFoundation 0x000000010bf50015 [NSException raise:format:] 197
3 Foundation 0x000000010a16cf61 ResolveConstraintArguments 372
4 Foundation 0x000000010a16d2cb [NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:] 80
.
.
.
Комментарии:
1. Почему бы вам просто не удалить ограничения и не добавить их во второй вид? обязательно добавьте ограничения к нужному представлению после добавления представления
2. Вместо замены представления. Создайте контейнер remove и добавьте из него требуемые представления.
3. Потому что оба ViewA, который инициализируется из кода, и ViewB, загруженный из Nib, являются одним и тем же классом. И да, я могу удалить ограничения, но мне также нужно добавить их ко второму представлению, как это делает метод.
4. Я основываюсь на следующей ссылке и пытаюсь ее реорганизовать. Создание пользовательских компонентов пользовательского интерфейса в iOS с помощью Swift
Ответ №1:
Я исправил это, … большое спасибо.
Я изменил код из:
let second: Any? = (isSecond) ? to : constraint.secondItem as? Any
Для:
let second: Any? = (isSecond) ? to : constraint.secondItem
Комментарии:
1. введите необязательный <Любой?> v.s. Любой?