Как сделать Cashapelayer бросить тень в iPhone OS 3.0?
-
04-10-2019 - |
Вопрос
Я использую кассапелайер с путем. Теперь я хочу, чтобы он бросил гладкую тень с около 10 единиц толщины.
Первый: Да, я мог бы создать только 11 объектов Cashapelayer, и каждый раз увеличивают контуру пути на 1 единицу с другим цветом и еще более альфа на каждой итерации. Но таким образом я взорваю свой след памяти, поскольку вещь - это половинный размер экрана, и это будет означать, что он будет иметь растровое изображение половинного экрана в памяти.
Так что, поскольку iPhone OS 3.2, я, вероятно, мог бы использовать эти нефтевые теневые свойства на Calayer. Но я хочу придерживаться ОС 3.0. Так какие варианты у меня есть, кроме противных выше?
Решение
Вы можете создать тень с помощью основной графики. Строительные блоки, которые вам понадобится, описаны в Кварцдемо образец. В частности, посмотрите на class QuartzMaskingView
в Кварцкласс.
- Захватить содержание слоя формы в изображение
- Установите тень по своему вкусу
- Начните слой прозрачности
- Зажим к изображению содержания слоев - вы будете нанесены за его пределами
- Нарисуйте свое изображение снова
Это приводит к окрашенной за тенью за пределами вашей области в маске.
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);