web-dev-qa-db-fra.com

Rendre le fond UISearchBar clair

Je ne parviens pas à effacer la barre de recherche J'ai essayé de la rendre claire en définissant sa couleur d'arrière-plan claire et j'ai également placé une image sous la barre de recherche

J'ai également fait un fond clair de la barre de recherche

 for (UIView *subview in self.searchBarHome.subviews) {
      if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
         [subview removeFromSuperview];//please help me to make clear background of uisearchbar
        break; 
    }
}
[self.searchBarHome setBackgroundColor:[UIColor clearColor]];
24
Vikram

Pour iOS7 +, il vous suffit de:

[self.searchBarHome setBackgroundColor:[UIColor clearColor]];
[self.searchBarHome setBarTintColor:[UIColor clearColor]]; //this is what you want

NOTE : Cela ne fonctionnera pas pour iOS6


Pour iOS6 +, les éléments suivants s'en occuperont même dans iOS7:

[self.searchBarHome setBackgroundColor:[UIColor clearColor]];
[self.searchBarHome setBackgroundImage:[UIImage new]];
[self.searchBarHome setTranslucent:YES];
33
staticVoidMan

Voici ma solution en Swift 3 (un combo des réponses de Scarafone et Andrew2M):

for view in searchBar.subviews.last!.subviews {
        if type(of: view) == NSClassFromString("UISearchBarBackground"){
            view.alpha = 0.0
        }
}

ou bien:

searchBar.barTintColor = UIColor.clear
searchBar.backgroundColor = UIColor.clear
searchBar.isTranslucent = true
searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
22
Eden

UISearchBar comprend deux sous-vues, elles sont "UISearchBarBackground" et "UITextField". Dans IOS8, vous devez supprimer "UISearchBarBackground" pour l'effacer.

for (UIView *subview in [[yourSearchBar.subviews lastObject] subviews]) {        
    if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
        [subview removeFromSuperview];
        break;
    }
}
16
Ruozi

La suppression de UISearchBarBackground peut entraîner un comportement inconnu, en particulier si vous commencez à utiliser l'élément de manière plus avancée.

La réponse de Ruozi était ma solution préférée pour saisir l'élément UISearchBarBackground mais je suggère de définir l'alpha à 0 plutôt que de supprimer la vue avec ce qui suit:

for (UIView *subview in [[self.searchBar.subviews lastObject] subviews]) {
    if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
        [subview setAlpha:0.0];
        break;
    }
}

Ajoutez le code ci-dessus à votre sous-classe UIViewController qui contient une barre de recherche IBOutlet *. Cet extrait de code donnera un arrière-plan transparent pour iOS8 et iOS9.

De plus, il peut être préférable de prendre la décision de conception d'inclure ce code dans votre sous-classe UISearchBar afin d'éviter d'encombrer votre viewController.

11
Andrew2M

Pour quiconque essaie de trouver une solution non hacky à cela, définissez simplement l'image d'arrière-plan sur zéro dans votre fichier Storyboard/Xib. Littéralement, il suffit d'écrire nil dans le champ d'image d'arrière-plan de l'UISearchBar.

9
Rog

La définition de backgroundColor et barTintColor ne m'a pas fonctionné iOS 9+, m'a laissé un fond noir. Cependant, la solution Ruozi fonctionnera. Voici une version Swift du même code.

for view in _searchBar.subviews.last!.subviews {
    if view.isKindOfClass(NSClassFromString("UISearchBarBackground")!) {
        view.removeFromSuperview()
    }
}
4
Scarafone

Ma solution sur Swift 4.1 | iOS 11.4 où je change les couleurs d'arrière-plan et de texte de UISearchBar

enter image description here

La clé est de trouver le composant UITextField de UISearchBar et de modifier ses paramètres:

let searchTextField = searchBar.value(forKey: "searchField") as? UITextField
searchTextField?.textColor = UIColor.white
searchTextField?.backgroundColor = UIColor.red
searchTextField?.attributedPlaceholder =  NSAttributedString(string: "Your Placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white.withAlphaComponent(0.5)])

Ensuite, je mets la "recherche" et l'image "claire"

//search image
searchBar.setImage(UIImage(named: "icon_search"), for: UISearchBarIcon.search, state: .normal)
//clear image
searchBar.setImage(UIImage(named: "icon_search_clear"), for: UISearchBarIcon.clear, state: .normal)
4
ivoroto

Si vous voulez changer cela ...

enter image description here

Pour ça...

enter image description here

Utilisation:

self.searchBar.searchTextField.backgroundColor = .clear
4
Derek Soike

Pour toute personne venant ici et ne pouvant pas faire fonctionner la solution de suppression ou alpha pour vous, assurez-vous d'avoir votre SearchBar SearchStyle PAS sur MINIMALIST. Modifiez-le par défaut et utilisez l'un des codes fournis ici

3
gmogames
extension UISearchBar {
    func changeSearchBarColor(fieldColor: UIColor, backColor: UIColor, borderColor: UIColor?) {
        UIGraphicsBeginImageContext(bounds.size)
        backColor.setFill()
        UIBezierPath(rect: bounds).fill()
        setBackgroundImage(UIGraphicsGetImageFromCurrentImageContext()!, for: UIBarPosition.any, barMetrics: .default)

        let newBounds = bounds.insetBy(dx: 0, dy: 8)
        fieldColor.setFill()
        let path = UIBezierPath(roundedRect: newBounds, cornerRadius: newBounds.height / 2)

        if let borderColor = borderColor {
            borderColor.setStroke()
            path.lineWidth = 1 / UIScreen.main.scale
            path.stroke()
        }

        path.fill()
        setSearchFieldBackgroundImage(UIGraphicsGetImageFromCurrentImageContext()!, for: UIControlState.normal)

        UIGraphicsEndImageContext()
    }
}
2
ChanOnly123

Utilisez simplement searchBar.searchBarStyle = .minimal travaille pour moi.

J'avais utilisé de nombreuses solutions de contournement pendant longtemps, jusqu'à ce que je découvre cette propriété accidentellement et fonctionne comme un charme.

2
Romulo BM

Sous-classe uisearchbar et remplacez la méthode initWithFrame et initWithCoder et définissez la couleur d'arrière-plan comme

// For searchbar created programmatically
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self configureSetup];
    }
    return self;
}

// For search bar created on xib
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self configureSetup];
    }
    return self;
}

- (void)configureSetup
{
    self.backgroundColor = [UIColor clearColor];
}

et utilisez la barre de recherche sous-classée à la place où vous avez spécifié UISearchBar

1
ldindu

Oh mec! J'ai cherché partout une solution et essayé plusieurs choses. Comme @gmogames l'avait mentionné ci-dessus, vous pouvez utiliser l'une de ces réponses, mais assurez-vous que le style de la barre de recherche est défini par défaut ou il ne fonctionnera pas. Donc, pour clarifier la solution, voici ce qui a fonctionné pour moi:

Définissez le style de la barre de recherche par défaut dans le Storyboard ou le code (où que vous ayez créé UISearchBar. Ajoutez ensuite ce code à votre contrôleur de vue:

mySearchBar.searchTextField.backgroundColor = .clear
1
humbleCoder

Pour iOS 12, Swift 4.x Un peu trop hacky mais la hiérarchie de la vue Debug montre que _UISearchBarSearchFieldBackgroundView est responsable de la couleur d'arrière-plan. Pour y accéder, ...

for subview in searchBar.subviews.last!.subviews {
   if subview.isKind(of: NSClassFromString("UISearchBarTextField")!) {
       for v in subview.subviews {
          if v.isKind(of: NSClassFromString("_UISearchBarSearchFieldBackgroundView")!) {
                  v.removeFromSuperview()
                }
            }
        }
    }

C'est trop hacky. Je préfère demander au designer d'accepter Apple couleur par défaut.

0
Johnson
searchBarStyle = .default
searchTextField.backgroundColor = .yourColor

Avec cette combinaison, vous pouvez supprimer le fond gris de searchTextField et définir le vôtre!

0
Vitya Shurapov