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]];
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];
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)
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;
}
}
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.
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.
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()
}
}
Ma solution sur Swift 4.1 | iOS 11.4 où je change les couleurs d'arrière-plan et de texte de UISearchBar
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)
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
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()
}
}
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.
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
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
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.
searchBarStyle = .default
searchTextField.backgroundColor = .yourColor
Avec cette combinaison, vous pouvez supprimer le fond gris de searchTextField et définir le vôtre!