2016-05-16 4 views
1

Я хочу встроить NSImageView в NSScrollView, чтобы при изменении размера NSScrollView его представление документа (то есть NSImageView) изменялось горизонтально (вверх или вниз) вниз), чтобы соответствовать ширине NSScrollView, в то время как ее содержимое масштабируется, чтобы сохранить соотношение сторон изображения. Следовательно, NSImageView может быть или не быть обрезанным NSScrollView, и вертикальная прокрутка может быть возможна.NSImageView: горизонтальная привязка к контейнеру, вертикальная шкала аспект

Это может сделать все более ясным: если бы у меня была опция меню в моей программе в меню «Вид», она называлась бы «Масштабирование по горизонтали».

Вот что я сделал:

  1. Создание NSImageView в редакторе макета.
  2. Используйте «Вставить в ...», чтобы вставить его в NSScrollView.
  3. Включить «пропорционально вверх или вниз» для параметра «Масштабирование» в редакторе атрибутов для NSImageView.
  4. Добавьте ограничения для привязки полей NSScrollView к своему контейнеру.
  5. Добавьте ограничения для привязки левой и правой сторон NSImageView к контейнеру.
  6. Уменьшение сжатия содержимого сопротивления приоритет по горизонтали от NSImageView до 251.

NSScrollView изменяет размеры, как и ожидалось. Поля NSImageView влево и вправо (или «ведущий» и «конечный», в атрибуте ограничения автомакета) ограничены в соответствии с NSScrollView. Изображение в NSImageView будет масштабироваться пропорционально вниз, чтобы оно соответствовало NSScrollView. Вертикальная прокрутка возможна, когда NSScrollView недостаточно высок для отображения всего изображения.

Есть две проблемы.

Во-первых, NSImageView увеличит вертикальный размер по мере необходимости для поддержания соотношения сторон, но когда NSScrollView сжимается (то есть, потому что содержащий окно сделано меньше) NSImageView никогда не уменьшает его вертикальный размер. Следовательно, может быть куча пустого пространства над и под изображением.

Мой огорченный недопонимание, что происходит здесь: Когда окно растет, механизм компоновки сообщает NSImageView, что он будет больше по горизонтали, а NSImageView видит, что он должен изменять его содержимое (поскольку он было дано указание - шаг 3) и говорит, что , как, будет больше по вертикали. Когда окно становится меньше, NSImageView узнает, что он будет уменьшаться горизонтально, но у него нет проблем с пустым пространством, поэтому он не просит меньше по вертикали.

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

Должен ли я программно сбросить вертикальный размер NSImageView, когда узнает, что его горизонтальный размер изменяется?

Вторая проблема заключается в том, что изображение не растет горизонтально за пределами его естественного размера.Поскольку NSImageView ограничен на своих ведущих/конечных ребрах, чтобы соответствовать его контейнеру, и поскольку ему было сказано масштабировать его содержимое вверх или вниз, я даже не могу даже догадываться, почему это происходит.

+0

Я определил, что при изменении размера NSImageView его ширина изменяется в соответствии с ограничениями, расположенными на его переднем и заднем фронтах, но его высота никогда не изменяется. Его высота устанавливается на высоту _scscaled_ изображения. Похоже, что высота содержимого не обновляется при масштабировании изображения. – Jamborino

ответ

0

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

float aspect = image.size.height/image.size.width; 
[imageView.heightAnchor constraintEqualToAnchor:imageView.widthAnchor 
            multiplier:aspect].active = YES; 
[scrollView.superview.heightAnchor constraintLessThanOrEqualToAnchor:imageView.heightAnchor].active = YES; 

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

  1. Изображение View.top = Superview.top
  2. Изображение View.leading = Superview.leading
  3. Изображение View.trailing = Superview.trailing
  4. Superview.bottom = Прокрутка View.bottom - 1
  5. Superview.top = Прокрутка View.top - 1
  6. Superview.leading = Прокрутка View.leading - 1
  7. Superview.trailing = Прокрутка View.trailing - 1