Search code examples
iphonecolorstexturesuitoolbar

Can I apply a texture to UIToolbar?


I tried doing this:

[toolbar setTint:[UIColor colorWithPatternImage:[UIImage imageNamed:@"thingFromMyBundle.png"]]];

but it just ended up black. At first I assumed you weren't allowed to "tint" with a texture, but I've seen apps recently that can do this. Am I missing something?

Thanks.


Solution

  • Add 2 files to your project, call them UINavigationBar-CustomTexture.h and UINavigationBar-CustomTexture.m for example, in those files put this:

    .h file:

    #import <UIKit/UIKit.h>
    @interface UINavigationBar (CustomTexture)
    @end
    

    .m file:

    #import "UINavigationBar-CustomTexture.h"
    
    @interface UIView (CustomTexture)
    - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
    @end
    
    @implementation UINavigationBar (CustomTexture)
    - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
        if ([self isMemberOfClass:[UINavigationBar class]]){
            UIImage *image = [UIImage imageNamed:@"myImage.png"];
            CGContextScaleCTM(ctx, 1.0f, -1.0f);
            CGContextDrawImage(ctx, CGRectMake(0, -image.size.height, self.frame.size.width, self.frame.size.height), image.CGImage);
        }else{
            [super drawLayer:layer inContext:ctx];
        }
    }
    @end
    

    Include the .h file where you instantiate your navigation controller. Make your png file 320x44. Depending on your texture, change the tint color of your navigation bar to something like this (to make the buttons on the navigation bar look better):

    [self.navigationController.navigationBar setTintColor:[UIColor colorWithHue:0 saturation:0 brightness:0.5f alpha:0.1f]];