2015-11-12 3 views
2

Я хочу применить тень к внешнему пространству круга. Но радиус тени вступает в силу также на внутренней стороне, так что основной круг выглядит меньше, чем есть на самом делеПочему радиус тени также оказывает влияние на внутреннюю часть круга?

Я рисую круг, как это:

self.shadowLayer = [CALayer layer]; 
self.shadowLayer.frame = self.view.layer.bounds; 
self.shadowLayer.shadowColor = [UIColor blueColor].CGColor; 
self.shadowLayer.shadowRadius = 0; 
self.shadowLayer.shadowOpacity = 1.0; 
self.shadowLayer.shadowOffset = CGSizeMake(0,0); 
CGRect frame = CGRectMake(0 , 50, self.view.bounds.size.width, self.view.bounds.size.width); 
self.shadowLayer.shadowPath = [UIBezierPath bezierPathWithOvalInRect:CGRectInset(frame, 40, 40)].CGPath; 
[self.view.layer addSublayer:self.shadowLayer]; 

И результат нормальный круг: enter image description here

Но если я изменить self.shadowLayer.shadowRadius от 0 до 30 результатов: enter image description here

вы можете увидеть, размер сплошного цвета в ядре shrin рунец. Я хочу, чтобы тень вступала в силу только на внешней стороне пути, а сплошной цвет имеет тот же размер, что и в случае shadow radius = 0. Затем добавляется красная кривая, после чего снимок сделан. Есть только увидеть разницу в размере.

ОБНОВЛЕНИЕ Одна идея состоит в том, чтобы уменьшить shadowRadius наполовину и расширить рамку на ту же величину. Я думаю, что это будет работать достаточно хорошо.

+0

попытаться дать -40, -40 для shadowlayer как cgrectinset –

+0

будет слишком большим. Рамка круга должна оставаться неизменной в обоих случаях. –

ответ

0

Вы можете использовать NSShadow и нарисовать пользовательский UIView, чтобы произвести эффект, который вы хотите.

Нарисуйте настраиваемое представление с кодом:

- (void)drawRect: (CGRect)frame 
{ 
    //// General Declarations 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    //// Color Declarations 
    UIColor* color4 = [UIColor colorWithRed: 0.301 green: 0.261 blue: 0.968 alpha: 1]; 
    UIColor* shadowColor = [UIColor colorWithRed: 0 green: 0 blue: 0 alpha: 1]; 

    //// Shadow Declarations 
    NSShadow* shadow = [[NSShadow alloc] init]; 
    [shadow setShadowColor: shadowColor]; 
    [shadow setShadowOffset: CGSizeMake(0.1, -0.1)]; 
    [shadow setShadowBlurRadius: 11]; 

    //// Oval Drawing 
    UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(CGRectGetMinX(frame) + 69, CGRectGetMinY(frame) + 14, 72, 70)]; 
    CGContextSaveGState(context); 
    CGContextSetShadowWithColor(context, shadow.shadowOffset, shadow.shadowBlurRadius, [shadow.shadowColor CGColor]); 
    [color4 setFill]; 
    [ovalPath fill]; 
    CGContextRestoreGState(context); 
} 

Что дает эффект тени на внешней окружности границы:

enter image description here

+1

Если вы используете 'CGContextSetShadowWithColor', нет необходимости в' NSShadow'. Чтобы использовать позже, вызовите ['- [NSShadow set]'] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSShadow_Class/#//apple_ref/occ/ instm/NSShadow/set). – DarkDust

+0

Что делать, если мы хотим сохранить ссылку и отправить ее в качестве параметра? Можем ли мы это сделать с помощью cgcontextsetshadowwithcolor? –

Смежные вопросы