Как заставить CAShapeLayer отбрасывать тень в iPhone OS 3.0?

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

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

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


person dontWatchMyProfile    schedule 23.05.2010    source источник
comment
Я не уверен, какую пользу дает вам CAShapeLayer в этом случае, возможно, вам лучше нарисовать путь самостоятельно, используя Core Graphics с тенью, установленной по вашему вкусу.   -  person Palimondo    schedule 19.05.2011


Ответы (1)


Вы можете создать тень с помощью 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);
person Palimondo    schedule 19.05.2011