Какао: Как изменить изображение при перетаскивании - PullRequest
6 голосов
/ 16 февраля 2010

В Interface Builder.app (и некоторых других приложениях с какао) перетаскивание изображения имеет очень приятный / сексуальный эффект, заключающийся в том, что он перетаскивает перетаскиваемое изображение из окна.

Например, в Интерфейсе Buildler.app:

  1. Показать палитру библиотеки (⇧⌘L или Меню инструментов -> Библиотека)
  2. Перетащите элемент из палитры "Библиотека"

ПРИМЕЧАНИЕ. При перетаскивании элемента из окна «Палитра библиотеки» он трансформируется из изображения исходного элемента списка в изображение значка перетаскиваемого элемента.

Я полностью реализовал перетаскивание в своем Приложении, используя обычные средства Cocoa NSDragSource / NSDragDestination.

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

-[NSView dragImage:at:offset:event:pasteboard:source:slideBack:]

Но это вызывается только в начале перетаскивания.

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

Ответы [ 4 ]

12 голосов
/ 16 февраля 2010

Вы, ребята, победили меня. :-)

Да, JLNDragEffectManager является открытым исходным кодом (с указанием авторства в ваших приложениях, пожалуйста) и доступен в моем блоге. Он должен работать как есть, без изменений до версии 10.5, но я не уверен, что вернусь дальше. Другие связались с ним (и это легко гуглировать), поэтому, чтобы избежать самозабвенных ссылок на блог, я оставлю это на этом.

Проблемы: Один разработчик прокомментировал (и представил код для исправления) отсутствие поддержки перетаскивания. Я просто не удосужился опубликовать обновление. Это единственная нерешенная проблема, о которой я знаю.

Улучшения: Я хотел бы добавить несколько «зон» (скажем, по одной на документ, поэтому при перетаскивании из документа в документ строки таблицы будут выглядеть как строки таблицы, но в любом месте за пределами окон документа они превращаются в значок файла в стиле HFS Promise Drag). Когда-нибудь ...

Дизайн: В самом посте подробно описываются мотивы дизайна и относительно простой эффект морфинга (кросс-фэйд плюс размер анимируются с использованием базовой NSAnimation и т. Д.). Код (как класс, так и демонстрационное приложение) полностью заблокирован и прокомментирован.

Не буду ссылаться на мой собственный пост, но хотел бы получить карму откровений за мои усилия. ; -)

ОБНОВЛЕНИЕ : Аналогичная (но лучше интегрированная) функциональность доступна с 10.7. Если вы нацелены на 10,7 или выше, лучше использовать новый API. JLNDragEffectManager отлично работает на 10.7, поэтому его можно использовать для более ранних версий.

5 голосов
/ 16 февраля 2010

JNLDragEffectManager делает именно это. :)

3 голосов
/ 16 февраля 2010

API не поддерживает это хорошо. Джошуа Ноцци дает метод, который выглядит разумно в этом блоге .

Эффект IB не такой уж причудливый. Это кроссфейд и масштаб. Удерживайте нажатой клавишу Shift, чтобы увидеть это более четко.

2 голосов
/ 19 февраля 2014

Начиная с 10.7+, текущий подход заключается в использовании

   enumerateDraggingItemsWithOptions:
                             forView:
                             classes:
                       searchOptions:
                          usingBlock:

API на NSDraggingInfo. Документация действительно плохая, но примеры ADC, такие как MultiPhotoFrame или TableViewPlayground , могут дать хорошее представление о том, как использовать новый механизм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...