2012-06-18 96 views
3

查看繪製內部陰影的生成代碼。除了陰影創建部分外,所有內容都非常清晰並且易於理解。copysignCore Graphics的內部陰影

我明白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,我們強制它總是正確行爲。