Как определить, является ли NSLayoutConstraint горизонтальным или вертикальным?
Похоже, что это должно быть простой задачей, но есть ли способ сказать программно, если NSLayoutConstraint
такое горизонтальное или вертикальное ограничение?
Единственный способ, которым я могу придумать, чтобы попытаться изменить это, это позвонить [constraint description];
а затем поиск в результирующей строке "V:"
или же "H:"
Причина, по которой я хочу найти эту информацию, заключается в том, что на prototype
UITableViewCell
на моем storyboard
единственное отличие в том, что один описывает горизонтальное расстояние от superview
, а другой вертикаль. Я хочу удалить вертикальные, программно добавить ограничения, чтобы описать добавление нового представления с учетом определенного параметра, возвращаемого с моего сервера.
Любые предложения будут чрезвычайно полезны!
РЕДАКТИРОВАТЬ:
Я принял ответ Греймоузера, потому что его объяснение - фантастический ответ, и именно так я закончил работу над синтаксическим анализом описания, но также хочу отдать должное @kongtestival, который также предложил этот ответ через твиттер, перед тем, как Греймоузер ответил мне здесь! Спасибо за помощь!
Вот фактический код, который я использовал, чтобы найти ограничение:
NSArray *constraints = [bubble constraints];
for (NSLayoutConstraint *constraint in constraints) {
if ([[constraint firstItem] isEqual:messageLabel] && [[constraint secondItem] isEqual:bubble] && [constraint secondAttribute] == NSLayoutAttributeTop) {
[bubble removeConstraint:constraint];
}
}
Вышеуказанное соответствует firstItem, secondItem, а затем secondAttribute ограничения, чтобы подтвердить с достаточной уверенностью, что я смотрю на правильное ограничение, затем я удаляю его и успешно добавляю мои новые описания ограничений после!
2 ответа
На самом деле, нет. VFL
карты к основному NSLayoutConstraint +:constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:
вызов.
Однако, если вы проверите firstAttribute или secondAttribute NSLayoutAttribute
свойства ограничения, вы можете вывести, если он горизонтальный или вертикальный. Если вы генерируете свои ограничения из VFL
они, вероятно, не слишком сложны, так что это может быть прямым выводом. Например, если вы встретите атрибут firstAttribute в суперпредставлении, установленный на NSLayoutAttributeLeft
и второй атрибут NSLayoutAttributeLeft
для детского взгляда, то, скорее всего, горизонтальный. Но только вероятно.
Вы можете просто захотеть разобрать описание, возможно подкласс NSLayoutConstraint
добавить горизонтальное / вертикальное свойство или сохранить вспомогательные данные для каждого ограничения в словаре, который записывает H или V.
Если вам специально нужно выполнить эту проверку для ограничений, относящихся к расстоянию просмотра от его контейнера, я думаю, что это выполнимо. Горизонтальные ограничения будут иметь первый и второй атрибут либо NSLayoutAttributeLeading
или же NSLayoutAttributeTrailing
и вертикальные ограничения будут иметь NSLayoutAttributeTop
или же NSLayoutAttributeBottom
,
Также, если эти ограничения установлены с использованием IB, вы можете создать для них точки сбыта.