核心图形,CGContextSetShadowWithColor的奇怪行为模糊高度

时间:2017-01-11 21:47:04

标签: ios iphone core-graphics

我使用 CGContextSetShadowWithColor 为我的形状添加了阴影。我尝试使用相同的模糊偏移高度。

然而,我在不同形状上看到的阴影高度是不同的。我不知道为什么会这样。

这是一些典型的代码。

CGSize offset = CGSizeMake(0.1, self.l_shadHeight);
CGContextSetShadowWithColor(context, offset, mauveBlurRadius, mauve.CGColor);

编辑 - 更多代码

+ (NSInteger)setShadowHeight
{
    NSInteger retVal = 10;

    if (IS_IPHONE_6P)
    {
        retVal = 7;
    }
    else if (IS_IPHONE_6)
    {
        retVal = 7;
    }
    else if (IS_IPHONE_5 || TARGET_INTERFACE_BUILDER)
    {
        retVal = 6;

    }
    else if (IS_IPHONE_4_AND_OLDER || IS_IPHONE)
    {
        retVal = 6;
    }
    else if (isiPadPro)
    {
        retVal = 16;
    }
    else if (IS_IPAD)
    {
        retVal = 11;
    }

    return retVal;
}

//

-(void)setSizingClassValues
{
    self.l_shadHeight = [DrawingConstants setShadowHeight];
}

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {

    [self setSizingClassValues];

    //// General Declarations
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = UIGraphicsGetCurrentContext();

    //// Shadow Declarations
    //UIColor* circleShadow = shadowColor2;
    UIColor* circleShadow = [shadowColor2 colorWithAlphaComponent: [DrawingConstants SHADOW_ALPHA]];

    CGSize circleShadowOffset = CGSizeMake(0.1, self.l_shadHeight);
    //CGFloat circleShadowBlurRadius = 5;
    CGFloat circleShadowBlurRadius = [DrawingConstants setShadowBlurRadius];

//

    //// Frames
    CGRect frame = self.bounds;

    CGFloat xPadding = 18;
    CGFloat YPadding = 19;
    CGFloat wPadding = 39;
    CGFloat hPadding = 54;

    if (isiPadPro || IS_IPAD)
    {
        if (self.size == sizeSmallerPerformance)
        {
            //so we don't have to rework autolayout on other screens!
            CGFloat fac = 2;
            xPadding = xPadding / fac;
            YPadding = YPadding / fac;
            wPadding = wPadding / fac;
            hPadding = hPadding / fac;
        }
    }

    //// Subframes
    CGRect group = CGRectMake(CGRectGetMinX(frame) + xPadding,
                              CGRectGetMinY(frame) + YPadding,
                              CGRectGetWidth(frame) - wPadding,
                              CGRectGetHeight(frame) - hPadding);

//

    //// Abstracted Attributes
    CGFloat circleSurroundStrokeWidth = self.l_borderWidth;
    CGFloat tongueLeftStrokeWidth = self.l_strokeWidth;;
    CGFloat tongueStrokeWidth = self.l_strokeWidth;

    //// Group
    {
        //// CircleSurround Drawing
        UIBezierPath* circleSurroundPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(CGRectGetMinX(group) + floor(CGRectGetWidth(group) * 0.00164) + 0.5, CGRectGetMinY(group) + floor(CGRectGetHeight(group) * 0.00161) + 0.5, floor(CGRectGetWidth(group) * 0.99836) - floor(CGRectGetWidth(group) * 0.00164), floor(CGRectGetHeight(group) * 0.99839) - floor(CGRectGetHeight(group) * 0.00161))];

        CGContextSaveGState(context);
        CGContextSetShadowWithColor(context, circleShadowOffset, circleShadowBlurRadius, circleShadow.CGColor);
        [circleFillColour setFill];
        [circleSurroundPath fill];
        CGContextRestoreGState(context);

        [whiteColour setStroke];
        circleSurroundPath.lineWidth = circleSurroundStrokeWidth;
        [circleSurroundPath stroke];

    }

    //// Cleanup
    CGGradientRelease(innerFaceGradient);
    CGColorSpaceRelease(colorSpace);   
}
@end

1 个答案:

答案 0 :(得分:0)

我发现了这个问题,我对错误的事情有了影响。相反,我把它添加到我最外面的小组。

谢谢@kurtrevis