web-dev-qa-db-fra.com

Personnaliser UISearchBar: Essayer de se débarrasser de la ligne noire 1px sous la barre de recherche

Ma question est déjà spécifiée dans le titre: je voudrais supprimer la ligne noire tracée au bas de la UISearchBar. Des idées?

Voici une image de ce que je veux dire:

search bar with black bottom line

METTRE À JOUR:

Je pense que la ligne fait partie de la UITableView 's tableHeaderView. Je ne sais toujours pas comment l'enlever.

39
strave

J'ai corrigé cela en ajoutant une subview à la pile de vues de searchBar comme ceci:

CGRect rect = self.searchBar.frame;
UIView *lineView = [[UIView alloc]initWithFrame:CGRectMake(0, rect.size.height-2,rect.size.width, 2)];
lineView.backgroundColor = [UIColor whiteColor];
[self.searchBar addSubview:lineView];

Ici, self.searchBar est un pointeur UISearchBar de ma classe de contrôleur.

19
Nonlinearsound

Essaye ça

 searchBar.layer.borderWidth = 1;

 searchBar.layer.borderColor = [[UIColor lightGrayColor] CGColor];
69
Ayush Goel

Pourquoi:

Donc, j'ai creusé dans l'API essayant de comprendre pourquoi cela se produit. Apparemment, quiconque a écrit l'API UISearchBar rastérisation des lignes sur une image et le définit comme étant backgroundImage.

Solution:

Je propose une solution plus simple, si vous voulez définir la backgroundColor et vous débarrasser des hairlines:

searchBar.backgroundColor = <#... some color #>
searchBar.backgroundImage = [UIImage new];

Ou si vous avez juste besoin d'une image de fond sans les hairlines:

searchBar.backgroundImage = <#... some image #>
42
Oxcug

J'ai 0.5px des lignes horizontales noires en haut et en bas de ma UISearchBar. La seule façon pour moi de m'en débarrasser jusqu'ici est de définir son style sur Minimal:

mySearchBar.searchBarStyle = UISearchBarStyleMinimal;
26
ancajic

Solution pour 

Xcode 10.1 Swift 4.2

 enter image description here

6
swift2geek

Swift 4.2:  

controller.searchBar.layer.borderWidth = 1
controller.searchBar.layer.borderColor = UIColor(red: 255/255, green: 253/255, blue: 247/255, alpha: 1.0).cgColor

Réponse basée sur la réponse d'Ayush. 

5
VBaarathi

Cette question a déjà été résolue mais peut-être que ma solution pourra aider quelqu'un d'autre. J'ai eu un problème similaire, sauf que j'essayais de supprimer la bordure supérieure de 1px. 

Si vous sous-classe UISearchBar, vous pouvez remplacer le cadre de cette façon.

- (void)setFrame:(CGRect)frame {
    frame.Origin.y = -1.0f;
    [super setFrame:frame];

    self.clipsToBounds = YES;
    self.searchFieldBackgroundPositionAdjustment = UIOffsetMake(0, 1.0f);
}

Ou si vous souhaitez réparer le pixel du bas, vous pouvez faire quelque chose comme ceci, (non testé).

- (void)setFrame:(CGRect)frame {
    frame.Origin.y = 1.0f;
    [super setFrame:frame];

    self.clipsToBounds = YES;
    self.searchFieldBackgroundPositionAdjustment = UIOffsetMake(0, -1.0f);
}

clipsToBounds et searchFieldBackgroundPositionAdjustment dans setFrame uniquement pour la simplicité de l'exemple.

De plus, searchFieldBackgroundPositionAdjustment n'est nécessaire que pour recentrer le champ de recherche.

METTRE &AGRAVE; JOUR

Il s'avère que le tableView décalera 1px de la mise à jour du Origin.y tant que le searchBar est actif. C'est un peu étrange. J'ai réalisé que la solution est aussi simple que de configurer, self.clipsToBounds = YES;

3
cnotethegr8

Définissez la tableHeaderView sur nil avant de placer votre UISearchBar ici. 

Si cela ne vous aide pas, essayez de le dissimuler. Tout d’abord, ajoutez votre barre de recherche à une variable UIView générique et de taille appropriée (par exemple, "wrapper") en tant que sous-vue, puis

CGRect frame = wrapper.frame;
CGRect lineFrame = CGRectMake(0,frame.size.height-1,frame.size.width, 1);
UIView *line = [[UIView alloc] initWithFrame:lineFrame];
line.backgroundColor = [UIColor whiteColor]; // or whatever your background is
[wrapper addSubView:line];
[line release];

Et puis ajoutez-le à la tableHeaderView.

self.tableView.tableHeaderView = wrapper;
[wrapper release];
3
Mundi

Attention. C'est un hack. Voudrais connaître un meilleur moyen, plus officiel.

Vous pouvez utiliser le débogueur pony pour déterminer où il se trouve dans la hiérarchie de sous-vues. Je pense que ce que vous voyez est un UIImageView privé appelé "séparateur"

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
  for (UIView* view in self.searchBar.subviews)  {
    if (view.frame.size.height == 1 && [view isKindOfClass:[UIImageView class]]) {
      view.alpha = 0;
      break;
    }
  } 
}
1
Ray Fix