Как заставить CAShapeLayer бросать тень в iPhone OS 3.0? - PullRequest
2 голосов
/ 23 мая 2010

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

Первое: да, я мог бы создать только 11 объектов CAShapeLayer и каждый раз увеличивать контур пути на 1 единицу с другим цветом и еще немного альфа на каждой итерации. Но таким образом я увеличиваю объем памяти, так как размер экрана составляет половину размера экрана, а это означает, что в памяти будет 11-кратное растровое изображение размера половины экрана.

Итак, начиная с iPhone OS 3.2, я мог бы использовать эти изящные свойства теней в CALayer. Но я хочу придерживаться ОС 3.0. Итак, какие у меня есть варианты, кроме одного противного выше?

1 Ответ

0 голосов
/ 19 мая 2011

Вы можете создать тень, используя Core Graphics. Необходимые строительные блоки описаны в примере QuartzDemo . В частности, посмотрите на class QuartzMaskingView в QuartzClipping.m .

  1. Захват содержимого слоя формы в изображение
  2. Установите тень по своему вкусу
  3. Начать прозрачность слоя
  4. Клип к изображению содержимого слоев - вы будете рисовать вне его
  5. Нарисуйте свое изображение снова

Это приводит к тому, что тень закрашивается за пределами вашей маскированной области.

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);
...