2013-05-27 3 views
1

У меня есть простая задача с анимацией NSWindow, но до сих пор не удается найти способ выполнить это.Скрыть часть NSWindow (анимация)

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

Есть ли способ сделать некоторые обрезки для окна, которое будет нарисовано только в области прямоугольника основного экрана?

Я не нашел ничего подобного в документах Apple. И я знаю, что некоторые эффекты пользовательского интерфейса достигаются путем создания трюков для имитации желаемого поведения. Любая информация очень ценится!

Мое первое предположение заключалось в создании нового окна со вторичным снимком содержимого экрана. А затем переместите мое главное окно под этим снимком. Но это плохо - контент на экране может оживить (например, видео).

ответ

3

Вы должны изменить его размер.

Очевидно, что изменение размера вашего реального окна не будет работать - вы измените размеры всех видов в виде побочных эффектов, и изменение размера любого вида на ноль будет иметь тенденцию заставлять его уходить.

Таким образом, вы должны выполнить некоторые ловкость рук:

  1. Take a screenshot of the window.
  2. Создание полей окна с размером кадра именно размер этого изображения. (Не используйте рамку реального окна - он не будет содержать тень.)
  3. Создайте NSView, чтобы быть видом содержимого окна без полей.
  4. Создайте представление изображения и поместите его в виде содержимого.
  5. Установить изображение autoresizingMask изображения, чтобы быть заметным на том же краю представления, что и край экрана, с которого вы будете анимировать окно. (Например, если вы одушевляете окно снизу, сделайте дно значимым.)

    Обратите внимание, что вы хотите, чтобы ширина и высота изображения были фиксированными. не значим. Вы измените размер окна, но хотите, чтобы вид изображения оставался одного и того же размера (и постепенно исчезал под краем окна).

  6. Если вы изменили уровень окна реального окна, установите соответствующий уровень окна окна без полей.
  7. Disable screen updates.
  8. Order без полого окна in front of реального окна.
  9. Order out настоящее окно.
  10. Enable screen updates.
  11. Используйте либо NSViewAnimation или Core Animation, чтобы оживить кадр без полого окна, изменяя свое начало в положение этого края экрана, и размер кадра на соответствующих осях вниз до нуля. Оставьте другую ось без изменений. Например, если вы оторваетесь от правого края, измените начало x на координату x правого края экрана и ширину на ноль и оставьте начало и высоту y нетронутыми.

    Пока вы на нем, вы можете оживить окно alphaValue до нуля (NSViewAnimation называет это эффектом FadeOut). Попробуйте это и без этого и посмотрите, как вы предпочитаете.

  12. Когда анимация завершена, закажите окно без полей и выбросьте его.
+0

Спасибо @Peter! Ваш ответ очень подробный. Я принимаю это, потому что многие пользователи найдут его очень полезным. Но я нашел лучшее решение для своего случая: вместо решения проблемы рисования я лучше переключу свое окно на самый левый/верхний/правый экран. Я вижу, что все другие приложения, которые скрываются от экрана, реализуют один и тот же подход. Но спасибо большое! – UJey

+0

@UJey: Что вы подразумеваете под «переключением моего окна на самый левый/верхний/правый экран»? Разве это не проблема, которую вы пытались решить? –

+0

, когда у вас есть 2 экрана, у вас всегда есть край, который лежит между экранами. И это была позиция моего окна - на основном дисплее, но между экранами. Это вызывало проблемы с видимостью окна на другом дисплее. Теперь, допустим, мой вторичный экран находится справа от основного. И мое окно должно скрываться за правой границей экрана. Поэтому я говорю, что я переместил мое окно на правый край самого правого (вторичного) экрана вместо того, чтобы быть расположенным на правой границе основного экрана. Ах, мои слова в замешательстве, но я думаю, у вас есть идея. – UJey

Смежные вопросы