0

I looked at a couple of links online to implement a colour gradient on my UINavigationBar in my app.

I made a category to UINavigationBar and called it UINavigationBar+Gradient. Here's the code for that :

#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);
}

However, I'm still getting the default grey navigation bar in the iOS simulator. Why ?

Objective-J
  • 319
  • 1
  • 2
  • 13

1 Answers1

0

This is because you override -drawRect: with a category for UINavigationBar. Check this question : What happens if two ObjC categories override the same method?

Two different categories implementing the same method for the same class will result in undefined behavior.

You need to subclass UINavigationBar to implement your colour gradient.

Community
  • 1
  • 1
Emmanuel
  • 2,897
  • 1
  • 14
  • 15