iphone - apple - Personalizza UISearchBar: cerca di sbarazzarti della linea nera 1px sotto la barra di ricerca



ios swift uitableviewcontroller (7)

La mia domanda è già specificata nel titolo: mi piacerebbe sbarazzarmi della linea nera disegnata sul fondo della UISearchBar . Qualche idea?

Ecco un'immagine di ciò che intendo:

AGGIORNAMENTO :

Penso che la linea sia parte di tableHeaderView UITableView . Ancora non so come rimuoverlo.

https://ffff65535.com


Perché:

Quindi, ho scavato nell'API cercando di capire perché questo sta accadendo. Apparentemente chiunque abbia scritto l'API UISearchBar sta rasterizzando le linee su un'immagine e impostandola come backgroundImage .

Soluzione:

Propongo una soluzione più semplice, se si desidera impostare lo backgroundColor e sbarazzarsi delle hairlines:

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

O se hai solo bisogno di un'immagine di sfondo senza le linee sottili:

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

Avvertimento. Questo è un hack. Vorrei conoscere un modo migliore, più ufficiale.

È possibile utilizzare il debugger pony per capire dove si trova nella gerarchia subview. Penso che la cosa che vedi sia una UIImageView privata chiamata "separatore"

- (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;
    }
  } 
}

Imposta tableHeaderView su nil prima di mettere lì UISearchBar .

Se questo non aiuta, prova a coprirlo. Per prima cosa aggiungi la tua barra di ricerca a un UIView generico e di dimensioni appropriate (ad esempio, "wrapper") come sottoview, quindi

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];

E poi aggiungilo a tableHeaderView.

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

Prova questo

 searchBar.layer.borderWidth = 1;

 searchBar.layer.borderColor = [[UIColor lightGrayColor] CGColor];

Questa domanda è già stata risolta, ma forse la mia soluzione può aiutare qualcun altro. Ho avuto un problema simile, tranne che stavo cercando di rimuovere il bordo superiore 1px.

Se si sottoclasse UISearchBar è possibile sovrascrivere il frame in questo modo.

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

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

O se vuoi fissare il pixel in basso puoi fare qualcosa di simile, (non testato).

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

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

Solo per semplicità dell'esempio sono clipsToBounds e searchFieldBackgroundPositionAdjustment in setFrame .

Anche la searchFieldBackgroundPositionAdjustment è necessaria solo per ricentrare il campo di ricerca.

AGGIORNARE

Si scopre che tableView sposterà origin.y dall'aggiornamento origin.y mentre la barra di ricerca è attiva. Sembra un po 'strano. Mi sono reso conto che la soluzione è semplice quanto l'impostazione, self.clipsToBounds = YES;


Soluzione per XCode 8.3.3 Swift 3.1


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

Rispondi a Swift sulla base della risposta di Ayush.





uisearchbar