Pregunta

Estoy usando un CAShapeLayer con un camino. Ahora lo quiero para lanzar una sombra suave con aproximadamente 10 unidades de espesor.

Primero: Sí, podría crear sólo 11 objetos CAShapeLayer y cada vez aumentar el perfil de la ruta por 1 unidad con un color diferente y un poco más alfa en cada iteración. Pero de esta manera que sople mi huella de memoria ya que lo es la mitad del tamaño de la pantalla y esto significaría tener 11x un mapa de bits de tamaño medio de la pantalla en la memoria.

Así que desde el iPhone OS 3.2 que probablemente podría utilizar esas propiedades de sombra ingeniosas sobre CALayer. Pero quiero que se adhieren a OS 3.0. Entonces, ¿qué opciones tengo, distinto del anterior desagradable?

¿Fue útil?

Solución

Se puede crear la sombra utilizando núcleo de gráficos. Los bloques de construcción que necesita se describen en QuartzDemo muestra . En particular, echar un vistazo a class QuartzMaskingView en QuartzClipping.m .

  1. Captura el contenido de la capa de forma en imagen
  2. Establecer la sombra de su agrado
  3. Comience capa de transparencia
  4. Clip a la imagen del contenido de capas - que vaya a dibujar fuera de ella
  5. Dibuje su imagen de nuevo

Este resultado en la sombra que se pinta fuera de su área enmascarada.

CGSize size = CGSizeMake(300, 100);

UIGraphicsBeginImageContextWithOptions(size,NO, 0.0);
[shapeLayer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CGRect flippedImageRect = 
    CGRectMake(0, 0, image.size.width, -image.size.height);

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGContextSetShadowWithColor(ctx, CGSizeMake(4, 4), 2, 
    [[UIColor colorWithWhite:0 alpha:0.4] CGColor]);
CGContextBeginTransparencyLayer(ctx, NULL);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextClipToMask(ctx, flippedImageRect, [image CGImage]);   
CGContextSetFillColorWithColor(ctx, [[UIColor redColor] CGColor]); 
CGContextDrawImage(ctx, flippedImageRect, [image CGImage]);
CGContextEndTransparencyLayer(ctx);
CGContextRestoreGState(ctx);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top