2010-02-15 30 views
6

En Interface Builder.app (y algunas otras aplicaciones de cacao), el arrastre de imagen tiene un efecto muy agradable/atractivo de transformar la imagen de arrastre mientras arrastra un elemento arrastrable desde su ventana .Cacao: Cómo transformar una imagen de arrastre mientras arrastra

Por ejemplo, en la interfaz Buildler.app:

  1. Muestra la Biblioteca paleta (⇧⌘L, o Menú Herramientas -> Biblioteca)
  2. arrastrar un elemento de la paleta Biblioteca

NOTA: a medida que arrastra el elemento fuera de la ventana Paleta de la biblioteca, se transforma de una imagen del elemento de la lista original a una imagen del ícono del elemento arrastrado.

Implementé completamente arrastrar y soltar en mi Aplicación utilizando las instalaciones normales de CocoDestSource/NSDragDestination.

Sin embargo, no puedo encontrar un gancho para hacer este cambio de imagen mientras arrastro. Estoy devolviendo la imagen de arrastre inicial anulando

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

Pero esto solo se llama al principio de la resistencia.

¿Cómo señala que desea reemplazar la imagen de arrastre actual (idealmente con el efecto sexy morph).

Respuesta

12

Ustedes me golpearon. :-)

Sí, JLNDragEffectManager es de código abierto (con atribución en sus aplicaciones, por favor) y está disponible en mi blog. Debería funcionar bien tal como está, sin modificaciones hasta 10.5, pero no estoy seguro de que vaya más lejos. Otros vinculados a él (y es fácilmente googleable), por lo que para evitar enlaces de blog auto-felicitaciones, lo dejo así.

Problemas: Un desarrollador comentó (y envió el código para corregir) la falta de soporte de desplazamiento de arrastre. No he podido publicar la actualización. Ese es el único problema pendiente que conozco.

Mejoras: me gustaría añadir varias "zonas" (por ejemplo, uno por cada documento, así que arrastrar de doc a doc mantiene filas de la tabla el aspecto de filas de la tabla, pero en cualquier lugar fuera de las ventanas doc los convierte en un icono de archivo a la HFS Promise Drag). Algún día ...

Diseño: La publicación en sí detalla el razonamiento detrás del diseño y el efecto de transformación relativamente simple (cross-fade plus size está animado usando NSAnimation básico, etc.). El código (la clase y la aplicación de demostración) está completamente bloqueado y comentado.

No se vinculará a mi propia publicación, pero me encantaría el karma de los votos por mi esfuerzo. ;-)

ACTUALIZACIÓN: similar (pero mejor integrada) funcionalidad está disponible a partir del 10.7. Si tiene una orientación de 10.7 o superior, es mejor usar la nueva API. JLNDragEffectManager funciona bien en 10.7, por lo que se puede utilizar para versiones dirigidas anteriormente.

+0

Muchas gracias, Joshua. Esto está funcionando maravillosamente. Además, gran publicación en el blog! :) ¿No crees que tienes un enlace a la corrección mencionada anteriormente para el arrastreset? –

+0

Si termina usando esta clase, hágamelo saber y agregaré su aplicación a la lista en la página de origen. –

3

La API no es compatible con esto bien. Joshua Nozzi da un método que parece razonable en this weblog post.

El efecto de IB no es tan elegante. Es un fundido cruzado y escala. Mantenga presionada la tecla shift para verla más claramente.

2

A partir de 10.7 o versiones posteriores el enfoque actual es el uso de la API

enumerateDraggingItemsWithOptions: 
          forView: 
          classes: 
         searchOptions: 
          usingBlock: 

en NSDraggingInfo. La documentación es realmente pobre, pero los ejemplos de ADC como MultiPhotoFrame o TableViewPlayground pueden dar una buena idea sobre cómo usar el nuevo mecanismo.

Cuestiones relacionadas