2010-05-23 3 views
2

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

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

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

+0

Я не уверен, что польза делает CAShapeLayer предоставить вам в этом случае, может быть, вы бы лучше рисовать путь самостоятельно, используя Core Graphics с тенью установить по своему вкусу. – Palimondo

ответ

0

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

  1. Захват содержание слоя формы в изображении
  2. Установите тень по своему вкусу
  3. Begin прозрачность слоя
  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); 
Смежные вопросы