Question Modification du fond du champ de recherche UISearchBar


j'ai un UISearchBar contenues dans un UIView et le UIView a été assigné à un UITableView's tableHeaderView. J'essaye de coiffer le UISearchBar pour ressembler à ceci:

What I want

Hors de la porte, voici à quoi ça ressemble:

How it looks now

Il y a des tas de questions et de réponses SO sur la façon de UISearchBar, son champ de recherche, etc., certains avec une attention particulière aux arrière-plans. Beaucoup d'entre eux impliquent de traverser le UISearchBar's subviews, trouver un UISearchBarBackground (ou _UISearchBarSearchFieldBackgroundView) objet et définir sa couleur de fond directement. J'essaie de trouver une API compatible pour ce faire, cependant ...

le setSearchFieldBackgroundImage:forState: méthode semble avoir un grand potentiel, mais c'est ce que je reçois lorsque j'utilise une image blanche (ou transparente) 1px en utilisant UIControlStateNormal:

Using a transparent image for setSearchFieldBackgroundImage:forState:

Des idées sur la façon de faire fonctionner cela? J'apprécierais que quelqu'un m'indique un post SO qui répond à cela, mais je pense vraiment que je les ai tous lus. Merci beaucoup.


13
2017-11-18 05:13


origine


Réponses:


Vous pouvez utiliser la apparenceWhenContainedIn pour cibler des éléments sans traverser la hiérarchie de vues. Quelque chose comme:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setBackgroundColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor lightGrayColor]];

METTRE À JOUR:

Comme appearanceWhenContainedIn est maintenant obsolète, utilisez

[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar self]]] <your setter here>];

7
2017-08-28 15:53



Je pense que le problème ici est que lorsque vous utilisez setSearchFieldBackgroundImage:forState:, la hauteur de votre image détermine réellement la hauteur du champ de recherche. Le champ de recherche standard (au moins depuis iOS 8) fait 28 points de haut, donc une image de cette hauteur devrait donner l’effet suivant.

(Un peu déroutant, cela signifie également qu’une image extensible en neuf parties n’aura généralement pas l’air correcte, donc si vous recherchez un aspect qui n’est pas uniquement blanc sur blanc, vous devez utiliser une image extensible en trois parties s'étire horizontalement.)


4
2017-10-13 20:02



Au-dessus d'iOS 5.0

[[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"YourBackground.png"]forState:UIControlStateNormal];

3
2017-11-18 06:50



Veuillez essayer le code suivant

[[UISearchBar appearance]setBackgroundImage:[UIImage imageNamed:@“searchbar_bg.png"]];
for (UIView *searchbuttons in searchBar.subviews) {

    if ([searchbuttons isKindOfClass:[UIButton class]]) {

        UIButton *cancelbutton = (UIButton *)searchbuttons;
        [cancelbutton setBackgroundImage:[UIImage imageNamed:@“canelBtn.png"] forState:UIControlStateNormal];
    }
}


 UITextField *searchField = [searchBar valueForKey:@"_searchField"];
 searchField.background = [UIImage imageNamed:@"bg.png"];

3
2017-11-18 06:11



Vous pouvez utiliser soit le barTintColor ou la backgroundImage propriété du UISearchBar pour accomplir directement ce que vous essayez de faire.

J'ai reproduit votre problème, et il semble être résolu par:

self.searchDisplayController.searchBar.barTintColor = [UIColor whiteColor];

ou

self.searchDisplayController.searchBar.backgroundImage = [self imageWithColor:[UIColor whiteColor]];

P.S. Si vous utilisez la solution backgroundImage, vous devrez créer la méthode imageWithColor comme suit

- (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return image;
}

Dis moi si ça marche!


3
2017-11-19 06:04



iO9 Perfect works.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[self searchSubviewsForTextFieldIn:self.searchBar] setBackgroundColor:  [UIColor redColor]];
}

- (UITextField*)searchSubviewsForTextFieldIn:(UIView*)view
{
    if ([view isKindOfClass:[UITextField class]]) {
        return (UITextField*)view;
    }
    UITextField *searchedTextField;
    for (UIView *subview in view.subviews) {
        searchedTextField = [self searchSubviewsForTextFieldIn:subview];
        if (searchedTextField) {
            break;
        }
    }
    return searchedTextField;
}

2
2017-12-29 06:47



La réponse de @ joneswah est dépréciée dans iOS 9.

Pour iOS 9, mettez ceci dans votre AppDelegate.m. J'ai également ajouté une solution de contournement pour le délai d'ouverture du clavier, lorsque le clavier est lancé pour la première fois.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

// Remove lag on oppening the keyboard for the first time when clicked on any UITextField
UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];

//searchBar background color change
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setBackgroundColor:[UIColor greenColor]];//background color
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blackColor];//text color

return YES;
}

1
2017-11-01 18:14



Comme d'autres l'ont suggéré, vous devez parcourir les sous-vues de votre barre de recherche et rechercher l'instance UITextField. MAIS, vous devez définir son layer.backgroundColor, car la définition de la propriété backgroundColor n'a aucun effet. Je donnerai un exemple:

for view in searchBar.subviews {
    for subview in view.subviews {
        if let searchField = subview as? UITextField {
            searchField.layer.backgroundColor = UIColor.whiteColor().CGColor
        }
    }
}

Cela vous donnera ce dont vous avez besoin.


0
2017-08-09 14:00