2012-06-18 4 views
3

Пила сгенерированный код для рисования внутренней тени. Все довольно ясно и понятно, за исключением той части, где создается тень с помощью copysign.Внутренняя тень с сердечной графикой

Я понимаю, что copysign делает, но почему и как он на самом деле используется в коде ниже.

Значение 0.1 кажется незначительным к значению xOffset.

CGContextRef context = UIGraphicsGetCurrentContext(); 

    UIColor* shadow = [UIColor redColor]; 
    CGSize shadowOffset = CGSizeMake(-2, -0); 
    CGFloat shadowBlurRadius = 2; 

    UIBezierPath* rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(50, 50, 50, 50)]; 
    [[UIColor grayColor] setFill]; 
    [rectanglePath fill]; 

    CGRect rectangleBorderRect = CGRectInset([rectanglePath bounds], -shadowBlurRadius, -shadowBlurRadius); 
    rectangleBorderRect = CGRectOffset(rectangleBorderRect, -shadowOffset.width, -shadowOffset.height); 
    rectangleBorderRect = CGRectInset(CGRectUnion(rectangleBorderRect, [rectanglePath bounds]), -1, -1); 

    UIBezierPath* rectangleNegativePath = [UIBezierPath bezierPathWithRect: rectangleBorderRect]; 
    [rectangleNegativePath appendPath: rectanglePath]; 
    rectangleNegativePath.usesEvenOddFillRule = YES; 

    CGContextSaveGState(context); 
    { 
    CGFloat xOffset = shadowOffset.width + round(rectangleBorderRect.size.width); 
    CGFloat yOffset = shadowOffset.height; 
    CGContextSetShadowWithColor(context, 
           CGSizeMake(xOffset + copysign(0.1, xOffset), yOffset + copysign(0.1, yOffset)), 
           shadowBlurRadius, 
           shadow.CGColor); 


    [rectanglePath addClip]; 
    CGAffineTransform transform = CGAffineTransformMakeTranslation(-round(rectangleBorderRect.size.width), 0); 
    [rectangleNegativePath applyTransform: transform]; 
    [[UIColor grayColor] setFill]; 
    [rectangleNegativePath fill]; 
    } 
    CGContextRestoreGState(context); 

ответ

5

Разработчик PaintCode здесь.

Смещение теней всегда округляется до целых пикселей. К сожалению, в Core Graphics существует некоторая проблема точности/округления. При определенных значениях теневых смещений округление как-то гаснет и используется неправильное смещение (например, 2 вместо 3).

Стратегически добавляя или вычитая 0,1 из смещения тени, мы вынуждаем его всегда вести себя корректно.

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