Как я могу получить NSView, чтобы изменить размер, чтобы соответствовать желаемым размерам его подпредставлений, используя Auto Layout? - PullRequest
7 голосов
/ 27 января 2012

У меня есть суперпредставление с тремя подпредставлениями. Два из этих подпредставлений имеют фиксированный размер и положение в суперпредставлении, но третье может различаться по размеру в зависимости от его содержимого.

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

Я реализовал - (NSSize) intrinsicContentSize для этого подпредставления, чтобы он возвращал размер, который он хотел бы иметь, но я не могу понять, как добавить ограничение, которое заставит суперпредставление изменить размер.

Есть идеи?

UPDATE:

Я получил эту работу, добавив ограничения к представлению следующим образом:

sizeWidthConstraint = [[NSLayoutConstraint constraintsWithVisualFormat:@"H:[self(==viewWidth)]" options:0 metrics:metrics views:views] lastObject];
sizeHeightConstraint = [[NSLayoutConstraint constraintsWithVisualFormat:@"V:[self(==viewHeight)]" options:0 metrics:metrics views:views] lastObject];

где «viewWidth» и «viewHeight» - ключи в словаре метрик с требуемыми значениями. Затем в udpateConstraints я могу проанализировать содержимое моего представления и сделать следующее:

[sizeHeightConstraint setConstant: size.height];
[sizeWidthConstraint setConstant: size.width];

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

ОБНОВЛЕНИЕ в ответ на вопрос панупана:

Когда вы создаете ограничение таким образом, вы можете вставить то, что по сути является именем переменной. В данном случае это имена viewWidth и viewHeight . Они известны как константы ограничения. Вы также передаете словарь, называемый метриками, вызову [NSLayoutConstrating constraintsWithVisualFormat: ...], который дает значения для этих констант.

Итак, в этом случае я начинаю с высоты и ширины по умолчанию для моего представления в качестве значений для словаря метрик viewWidth и viewHeight . Позже я использую метод setConstant: для изменения этих значений. В приведенном выше примере size - это структура CGSize, которую я вычислил из содержимого представления (т.е. на основе размеров его подпредставлений), и я использую значения ширины и высоты для настройки констант.

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

...