Наложение NSView поверх NSScrollView - PullRequest
9 голосов
/ 18 января 2011

У меня есть NSScrollView, который заполняет все окно и отображает огромное изображение. Теперь я хотел бы наложить пользовательский NSView на части вида прокрутки (например, высота 20 пикселей и ширина окна) для отображения дополнительной информации. Когда пользователь прокручивает представление прокрутки, пользовательский NSView вверху должен оставаться там, где он есть.

Я пробовал следующее:

  1. Создать экземпляр NSView размера моего окна
  2. Добавить NSScrollView как подпредставление ранее сгенерированного NSView
  3. Добавьте мой пользовательский вид как подпредставление к NSView на шаге 1

Это работает в начале, представление прокрутки отображается правильно, а также мой собственный NSView. Однако, как только я начинаю перемещать представление прокрутки (прокрутка), пользовательский NSView прокручивается вместе с содержимым NSScrollView и в конечном итоге исчезает, когда его перемещение выходит за границы, а часть представления прокрутки, на которой он был расположен, перерисовывается , Как я мог эффективно наложить свой собственный NSView поверх NSScrollView и убедиться, что он остается на месте?

Спасибо!

Ответы [ 2 ]

9 голосов
/ 22 января 2011

У вас есть два варианта:

Сначала отключите «Копировать при прокрутке».Вы можете сделать это непосредственно в IB или установив опцию copiesOnScroll для contentView члена NSScrollView.Эта опция, которая включена по умолчанию, делает так, чтобы представление прокрутки «копировало существующее визуализированное изображение во время прокрутки (рисование только открытых частей его вида документа)».Если он выключен, «он заставляет каждый раз перерисовывать содержимое».Таким образом, если производительность не является большой проблемой, она работает только для того, чтобы отключить это.

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

Второй вариант - оставить «Копировать на свитке» включенным, а затем создать окно без полей, содержащее наложенный вид.Это на самом деле не так хакерски, как может показаться, поскольку вы можете добавить экземпляр NSWindow в качестве дочернего элемента текущего окна, чтобы он автоматически перемещался вместе с главным окном при его перемещении.

The *Пример 1013 * RoundTransparentWindow даст вам отличный пример для создания окна, которое будет содержать ваше наложение.Затем просто используйте NSWindow addChildWindow, чтобы прикрепить его к главному окну.

Обратите внимание, что при таком подходе вам нужно будет обрабатывать время представления и скрытия окна наложения.Также кажется, что при максимизации родительского окна положение дочернего окна автоматически не корректируется.Таким образом, вам придется справиться с этим тоже.Но это отличное решение, если вы не хотите жертвовать значительным улучшением производительности при использовании «Копировать на свитке».

3 голосов
/ 15 февраля 2011

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

Как описано в CocoaDev wiki , вам просто нужно создать новое NSWindow в Интерфейсном Разработчике, сделать его экземпляром LKOverlayWindow и либо присоединить NSScrollView через выход, либо указать егов коде.После присоединения к представлению с прокруткой содержимое окна LKOverlayWindow будет перекрывать представление с прокруткой и отслеживать его по мере его перемещения и изменения размера (последний, похоже, работает только с NSScrollView в качестве выхода окна).Пример проекта предоставлен автором здесь .

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

...