CGGradient没有在UINavigationBar上工作

时间:2014-02-08 09:36:43

标签: ios objective-c uinavigationbar

我在线看了几个链接,在我的应用中UINavigationBar上实现了颜色渐变。

我为UINavigationBar制作了一个类别,并将其命名为UINavigationBar+Gradient。这是代码:

#define MAIN_COLOR_COMPONENTS       { 0.153, 0.306, 0.553, 1.0, 0.122, 0.247, 0.482, 1.0 }
#define LIGHT_COLOR_COMPONENTS      { 0.478, 0.573, 0.725, 1.0, 0.216, 0.357, 0.584, 1.0 }

@implementation UINavigationBar (UINavigationBar+Gradient)

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGFloat locations[2] = { 0.0, 1.0 };
    CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();

    CGFloat topComponents[8] = LIGHT_COLOR_COMPONENTS;
    CGGradientRef topGradient = CGGradientCreateWithColorComponents(myColorspace, topComponents, locations, 2);
    CGContextDrawLinearGradient(context, topGradient, CGPointMake(0, 0), CGPointMake(0,self.frame.size.height/2), 0);
    CGGradientRelease(topGradient);

    CGFloat botComponents[8] = MAIN_COLOR_COMPONENTS;
    CGGradientRef botGradient = CGGradientCreateWithColorComponents(myColorspace, botComponents, locations, 2);
    CGContextDrawLinearGradient(context, botGradient,
                                CGPointMake(0,self.frame.size.height/2), CGPointMake(0, self.frame.size.height), 0);
    CGGradientRelease(botGradient);

    CGColorSpaceRelease(myColorspace);


    // top Line
    CGContextSetRGBStrokeColor(context, 1, 1, 1, 1.0);
    CGContextMoveToPoint(context, 0, 0);
    CGContextAddLineToPoint(context, self.frame.size.width, 0);
    CGContextStrokePath(context);

    // bottom line
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0);
    CGContextMoveToPoint(context, 0, self.frame.size.height);
    CGContextAddLineToPoint(context, self.frame.size.width, self.frame.size.height);
    CGContextStrokePath(context);
}

但是,我仍然在iOS模拟器中获得默认的灰色导航栏。为什么?

1 个答案:

答案 0 :(得分:0)

这是因为您使用-drawRect:的类别覆盖UINavigationBar。 请检查此问题:What happens if two ObjC categories override the same method?

  

为同一方法实现相同方法的两个不同类别   class会导致未定义的行为。

您需要继承UINavigationBar以实现颜色渐变。