macos cocoa calayer nsview

macos - La rotación NSView respaldada por capas y hermanos sesgados



cocoa calayer (1)

Has escrito que probaste "setNeedsDisplay". ¿Estás llamando a este método desde el hilo principal? En una de mis aplicaciones no pasó nada si llamé a setNeedsDisplay desde otro hilo. Si quiere asegurarse de que la pantalla no sea válida, utilice el despacho de la siguiente manera:

dispatch_async(dispatch_get_main_queue(), ^{ [view setNeedsDisplay:YES]; });

Además, eche un vistazo a su inspector de IB. A veces, las vistas respaldadas por capas no les gusta mezclarse con vistas no respaldadas por capas. Asegúrese de que en el soporte de la capa "View Effects Inspector" esté activado para todas las subvistas de su capa raíz.

(En mi programa, a veces NSButtons desaparecía si el soporte de capas estaba desactivado)

Tengo un problema extraño con NSView con capa de respaldo y sus hermanos, algunos de ellos no se representan correctamente cuando se agregan a la jerarquía de vista existente adjunta a la supervista girada. A continuación están los detalles.

El problema

- NSScrollView (layer can be here) - NSClipView (or here) - Document View (or even here) - Some *rotated* subview - { Problematic sublings }

Por lo tanto, la jerarquía en sí es bastante simple y común: una vista de desplazamiento con algún documento, las subvistas de documentos representan algún contenido. En mi caso, es contenido de gráficos y se puede rotar. Las vistas giradas pueden tener algunas subvistas adicionales -varios marcadores, puntos de control, etc.- y es allí donde enfrento problemas extraños con gráficos sesgados una vez que uso CALayer para un back-end:

Las imágenes de la cámara se representan por separado , no son parte de este árbol de visualización, preste atención a los marcadores y botones.

Como puede ver en la imagen, tengo algunas vistas de prueba con subvistas (solo botones aleatorios). El objeto a la derecha se representa correctamente, siempre. De acuerdo con mis pruebas, cada NSView con frameRotation entre [0, pi/2] muestra OK. El objeto a la izquierda se vuelve borroso, parece que el almacenamiento en caché para este elemento es demasiado pequeño. Sucede cuando frameRotation está en el rango [pi/2, pi] .

Lo más extraño

Este problema no ocurre en "rotación en tiempo real". Es decir, si solo cambio el frameRoation de la jerarquía de configuración, con cada subvista en su lugar, todo funciona bien. Sin embargo, cuando se agregan sublingos al objeto ya rotado , se produce un error y da esta apariencia borrosa.

En mi aplicación, aparece una subvista especial cuando el usuario hace clic en el elemento, que es ''el momento en que se agregan los hermanos a la supervista.

Parece que la capa de fondo tiene un búfer de almacenamiento en caché para las subvistas y algunas de ellas se calculan con el tamaño incorrecto cuando se gira la vista de raíz.

¿Cómo se implementa y qué he intentado?

  1. Las vistas son bastante simples y estándar. He intentado presionar [view setWantsLayer:YES] en las vistas de la raíz de la jerarquía: vista de desplazamiento, vista de clip, vista de documento, cada resultado fue el mismo. Sin capas hechas a mano, sin hosts de capa.
  2. Las vistas de contenido, los hermanos y, de hecho, todo el árbol de vistas (excepto las vistas mencionadas anteriormente) no tienen capas. Aunque, he intentado activar capas para varios elementos sin éxito.
  3. Intenté forzar la actualización (setNeedsDisplay) de la capa de fondo sin suerte
  4. Volver a configurar la capa completamente parece estar funcionando, pero tarda mucho.

¿La solución?

Esa es la pregunta, en realidad. ¿Alguien ha enfrentado tal problema? ¿Tal vez alguien sabe cómo forzar a la capa a soltar todas las cachés y renovarlas por completo? Hasta ahora, tengo solo dos soluciones: dejar caer las capas por completo (funciona, pero también se vuelven atractivas) o restablecer la capa que llama a setWantsLayer:NO seguido de setWantsLayer:YES . Este tiene un rendimiento terrible.