Как определить, является ли NSLayoutConstraint горизонтальным или вертикальным?

Похоже, что это должно быть простой задачей, но есть ли способ сказать программно, если NSLayoutConstraint такое горизонтальное или вертикальное ограничение?

Единственный способ, которым я могу придумать, чтобы попытаться изменить это, это позвонить [constraint description]; а затем поиск в результирующей строке "V:" или же "H:"

Причина, по которой я хочу найти эту информацию, заключается в том, что на prototypeUITableViewCell на моем 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, вы можете создать для них точки сбыта.

Другие вопросы по тегам