2011-05-13 15 views
5

He estado buscando pero no puedo encontrar una respuesta al respecto. Estoy intentando hacer una vista que muestre sus contenidos normalmente, pero cualquier cosa que esté debajo (en el eje z) se verá borrosa.Fondo borroso debajo de un NSView

Parece que no logro hacerlo de inmediato. Todo lo que intento (en el mejor de los casos) desenfoca el contenido de la vista, no lo que está debajo.

Respuesta

0

Si usa una imagen que es significativamente más pequeña que el marco de la vista y escala la imagen, se verá borrosa.

Puede usar CALayers. Declare una capa raíz y agregue la imagen de fondo como una subcapa. Coloque los "contenidos" en una subvista con un fondo transparente. (De lo contrario, el "contenido" probablemente ser oscurecida por la subcapa borrosa.)

Aquí está el código parcial (y no probado) para la creación de la subcapa:

// Set up the root layer. 
[[self.aViewController view] setLayer:[CALayer layer]]; 
[[self.aViewController view] setWantsLayer:YES]; 
// Set up a sublayer. 
CALayer *blurredSublayer = [CALayer layer]; 
NSRect rectOfView = [self.aViewController view] frame]; 
blurredSublayer.bounds = rectOfView; 
// Views are usually positioned from their lower left corner, but CALayers are positioned from their center point. 
blurredSublayer.position = CGPointMake(rectOfView.size.width/2, rectOfView.size.height/2); 

// Set the sublayer's contents property to the image you've chosen. You might need to do the scaling when you set up the CGImageRef used by the contents property. (I haven't done this; I leave it to you.) 

// Add the sublayer to the view's root layer. 
[self.aViewController.view.layer addSublayer:blurredSublayer]; 

// You'll probably want to save expense by calling setWantsLayer:NO for the contents-bearing subview, since it will have been turned on when you set up the superview's root layer. 

o podría ser más fácil usar un CGContext. Pero con el CALayer tienes la propiedad zPosition que mencionaste.

P.S. El uso de "contenidos" y "supervista" y "subcapa" hace que la estructura sea confusa. Aquí hay una jerarquía descriptiva. El mencionado en primer lugar artículo está en la parte inferior y este último en la parte superior, como lo sería en el IB:

  • supervista con la capa de raíz
  • subcapa borrosa de supervista (propiedad contenidos de subcapa se escala plano de la imagen)
  • subvista/s (campos de texto o lo que tenía en mente como "contenidos")
2

Control hacia fuera este artículo sobre Cocoanetics, le da algunas instrucciones de cómo configurar correctamente un NSView con el fondo borroso: http://www.cocoanetics.com/2013/10/blurring-views-on-mac/

También hay una clase RMBlurredView en Github: https://github.com/raffael/RMBlurredView

La idea detrás de esto es el uso de una capa de NSView respaldados con una CIGaussianBlur CIFilter aplica en la propiedad backgroundFilters. Todos los indicadores importantes están configurados correctamente en la clase mencionada.

Cuestiones relacionadas