Как сделать Cashapelayer бросить тень в iPhone OS 3.0?

StackOverflow https://stackoverflow.com/questions/2893109

  •  04-10-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Вы можете создать тень с помощью основной графики. Строительные блоки, которые вам понадобится, описаны в Кварцдемо образец. В частности, посмотрите на class QuartzMaskingView в Кварцкласс.

  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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top