41

How can set the background image, or clear the background, of a search bar, like the note application?

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
Mc.Lover
  • 4,813
  • 9
  • 46
  • 80

13 Answers13

175

A future-proof way:

[searchBar setBackgroundImage:[UIImage new]];
[searchBar setTranslucent:YES];
Rudolf Adamkovič
  • 31,030
  • 13
  • 103
  • 118
29

mj_ has the answer that i used. i was just going to comment as such but i can't yet. So i'll just post my own answer with my implementation where I add a search bar to the top of a table view with a semi-transparent BG.

DLog(@"    Add search bar to table view"); 

//could be a UIImageView to display an image..?
bg = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 45)] autorelease];
bg.backgroundColor        = [UIColor blackColor];
UISearchBar *sb           = [[[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 290, 45)] autorelease];
sb.barStyle               = UIBarStyleBlackTranslucent;
sb.showsCancelButton      = NO;
sb.autocorrectionType     = UITextAutocorrectionTypeNo;
sb.autocapitalizationType = UITextAutocapitalizationTypeNone;
sb.delegate               = self;
[bg addSubview:sb];
table.tableHeaderView     = bg;

for (UIView *subview in sb.subviews) {
    if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
        [subview removeFromSuperview];
        break;
    }
}   
katbyte
  • 2,665
  • 2
  • 28
  • 19
  • 3
    +1 for still being accurate in 2011. I was looking for the last five lines of your example. Cheers! – epologee Jan 25 '11 at 21:20
  • if you use an uiimageview to display a backgroundimage and you want to hide the searchbar behind the navigationbar, the image needs to be 44 px height. Or use clipsToBounds = YES, otherwise there will be a 1 px line drawn under the navigationbar. – Olof Jul 25 '11 at 09:32
  • I did like this: NSClassFromString([NSString stringWithFormat:@"U%@Sea%@", @"I", @"rchBarBackground"]) in case apple would search for strings naming their private class.. but don't know if it would help(?) – hfossli Aug 19 '11 at 13:29
  • 1
    Will Apple reject this code because it's using private class "UISearchBarBackground"? – nonamelive Dec 25 '11 at 06:00
  • I used this in an application that was submitted to the app store and it was not rejected. – katbyte Dec 10 '12 at 19:45
14

I had problems w/ the answer above. I used the following.

for (UIView *subview in searchBar.subviews) {
    if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
        [subview removeFromSuperview];
        break;
    }
}
mj_
  • 6,297
  • 7
  • 40
  • 80
12

This worked for me (ios4.2+)

// Change the search bar background
-(void)viewWillAppear:(BOOL)animated {
    for (UIView *subview in self.searchBar.subviews) {
        if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
            UIView *bg = [[UIView alloc] initWithFrame:subview.frame];
            bg.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"search_bar_bg"]];
            [self.searchBar insertSubview:bg aboveSubview:subview];
            [subview removeFromSuperview];
            break;
        }
    }   
}
Chris
  • 39,719
  • 45
  • 189
  • 235
8

You have two questions here:
1.UISearchBar clear background color:
See my answer here

2.Set background image Solution:(If you are in iOS 5.0 +)

[[UISearchBar appearance]setSearchFieldBackgroundImage:[navBarGradImage resizableImageWithCapInsets:inset2] forState:UIControlStateNormal];

NOTE: You can also try using a transparent image as a background.

Hope this helps.

Community
  • 1
  • 1
geekay
  • 1,655
  • 22
  • 31
8

I just came up with a solution that works really well. You have to override the UISearchBar and then hide both the Background and Segment Control layers. Then Draw the background.

@ .m

#import "UISearchBar.h" 
#import <QuartzCore/QuartzCore.h>

@implementation UISearchBar(CustomBackground)

- (id)init
    {
        for ( UIView * subview in self.subviews ) 
        {
            if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground") ] ) 
                subview.alpha = 0.0;  

            if ([subview isKindOfClass:NSClassFromString(@"UISegmentedControl") ] )
                subview.alpha = 0.0; 
        } 

        return self;
    }

+ (UIImage *) bgImagePortrait
    {
        static UIImage *image = nil;
        if (image == nil)
            image = [[UIImage imageNamed:@"UISearchBarBack.png"] retain ];

        return image;
    }

+ (UIImage *) bgImageLandscape
    {
        static UIImage *image = nil;
        if (image == nil)
            image = [[UIImage imageNamed:@"UISearchBarBack.png"] retain];

        return image;
    }

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)contenxt
    {
        if ([self isMemberOfClass:[UISearchBar class]] == NO)
            return; 

        UIImage * image = ( self.frame.size.width > 320 ) ? [UISearchBar bgImageLandscape ] : [UISearchBar bgImagePortrait ];  

        for ( UIView * subview in self.subviews ) {
            if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground") ] ) 
                subview.alpha = 0.0; 

            if ([subview isKindOfClass:NSClassFromString(@"UISegmentedControl") ] )
                subview.alpha = 0.0; 
        }

        CGContextTranslateCTM( contenxt , 0 , image.size.height );
        CGContextScaleCTM( contenxt, 1.0, -1.0 );
        CGContextDrawImage( contenxt , CGRectMake( 0 , 0 , image.size.width , image.size.height ), image.CGImage );
    }  

@end

@ .h

#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>


@interface UISearchBar(CustomBackground) 

@end

Hope this helps!

Designerd
  • 531
  • 5
  • 8
4

searchBar.searchBarStyle = UISearchBarStyleMinimal;

Bradley Thomas
  • 4,060
  • 6
  • 33
  • 55
4

I prefer to just set the alpha to 0 so you can hide/show on demand.

// Hide
[[self.theSearchBar.subviews objectAtIndex:0] setAlpha:0.0];

// Show
[[self.theSearchBar.subviews objectAtIndex:0] setAlpha:1.0];
Michael Camden
  • 1,183
  • 8
  • 9
4

How to set background color in UISearchBar:

#import <QuartzCore/QuartzCore.h>

Then make an outlet connection to search bar (say, objSearchbar), and use these lines :

for (UIView *subview in self.objSearchbar.subviews) 
{
    if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) 
    {
        [subview removeFromSuperview];
        break;
    }
}

self.tweetSearchbar.layer.backgroundColor = [UIColor blueColor].CGColor;
rickster
  • 124,678
  • 26
  • 272
  • 326
iGautam
  • 121
  • 3
  • 9
2

Look here: UISearchbar background image change

Akshay Aher
  • 2,525
  • 2
  • 18
  • 33
hennes
  • 9,147
  • 4
  • 43
  • 63
2

with iOS8 sdks apple moved @"UISearchBarBackground" view one level deeper, so have will need to look at subviews of the child-views as bellow,

for (UIView *subview in searchBar.subviews) {
        for(UIView* grandSonView in subview.subviews){
            if ([grandSonView isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
                grandSonView.alpha = 0.0f;
            }else if([grandSonView isKindOfClass:NSClassFromString(@"UISearchBarTextField")] ){
                NSLog(@"Keep textfiedld bkg color");
            }else{
                grandSonView.alpha = 0.0f;
            }
        }//for cacheViews
    }//subviews
1

Set background image

    UIImageView *backgroundView = [[UIImageView alloc] initWithFrame:searchBar.bounds];
    backgroundView.image = [UIImage imageNamed:@"xxxx.png"];
    [searchBar insertSubview:backgroundView atIndex:1]; // at index 1 but not 0
    [backgroundView release];
Míng
  • 2,500
  • 6
  • 32
  • 48
0

One liner:

[[self.theSearchBar.subviews objectAtIndex:0] removeFromSuperview];
gotnull
  • 26,454
  • 22
  • 137
  • 203