Настройте UISearchBar: пытаясь избавиться от черной линии 1px под строкой поиска - PullRequest
41 голосов
/ 01 октября 2011

Мой вопрос уже указан в заголовке: я хотел бы избавиться от черной линии, нарисованной внизу UISearchBar.Есть идеи?

Вот изображение того, что я имею в виду:

search bar with black bottom line

ОБНОВЛЕНИЕ :

Я думаю, чтолиния является частью UITableView s tableHeaderView.Я до сих пор не знаю, как его удалить.

Ответы [ 11 ]

72 голосов
/ 25 января 2012

Попробуйте это

 searchBar.layer.borderWidth = 1;

 searchBar.layer.borderColor = [[UIColor lightGrayColor] CGColor];
43 голосов
/ 13 августа 2014

Почему:

Итак, я копался в API, пытаясь выяснить, почему это происходит. Очевидно, кто бы ни написал, API UISearchBar растеризует линии на изображение и устанавливает его как backgroundImage.

Решение:

Я предлагаю более простое решение, если вы хотите установить backgroundColor и избавиться от волосков:

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

Или, если вам просто нужно фоновое изображение без волос:

searchBar.backgroundImage = <#... some image #>
26 голосов
/ 22 апреля 2014

У меня 0.5px черные горизонтальные линии сверху и снизу моего UISearchBar.Единственный способ избавиться от них - это установить для него стиль Minimal:

mySearchBar.searchBarStyle = UISearchBarStyleMinimal;
19 голосов
/ 22 ноября 2011

Я исправил это, добавив subview в стек просмотра searchBar следующим образом:

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

Здесь self.searchBar - это указатель UISearchBar моего класса контроллера.

6 голосов
/ 29 августа 2017

Решение для

XCode 10.1 Swift 4.2

enter image description here

5 голосов
/ 07 марта 2016

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

Ответ основан на ответе Аюша.

3 голосов
/ 03 июля 2013

Этот вопрос уже решен, но, возможно, мое решение может помочь кому-то еще.У меня была похожая проблема, за исключением того, что я пытался удалить верхнюю границу 1px.

Если вы подкласс UISearchBar, вы можете переопределить кадр следующим образом.

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

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

Или, если вы хотите исправить нижний пиксель, вы можете сделать что-то подобное (не проверено).

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

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

Только для простоты примера clipsToBounds и searchFieldBackgroundPositionAdjustment в setFrame.

Также searchFieldBackgroundPositionAdjustment необходим только для повторного центрирования поиска

ОБНОВЛЕНИЕ

Оказывается, что tableView сместит 1px с обновления origin.y, пока активна панель поиска.Это немного странно.Я понял, что решение так же просто, как установка, self.clipsToBounds = YES;

3 голосов
/ 01 октября 2011

Установите tableHeaderView на nil перед тем, как поместить туда UISearchBar.

Если это не поможет, попробуйте прикрыть это. Сначала добавьте панель поиска в общий и соответствующего размера UIView (скажем, «обертка») в качестве подпредставления, затем

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

А затем добавьте его в tableHeaderView.

self.tableView.tableHeaderView = wrapper;
[wrapper release];
1 голос
/ 04 июня 2013

Внимание. Это взломать Хотелось бы узнать лучший, более официальный способ.

Вы можете использовать отладчик пони, чтобы выяснить, где в иерархии подпредставлений он находится. Я думаю, что вы видите, это частный UIImageView под названием «разделитель»

- (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;
    }
  } 
}
0 голосов
/ 16 октября 2018

что работает со мной , установив строку поиска barTintColor в качестве цвета панели навигации

    searchBar.barTintColor = UIColor.colorWithHexString(hexStr: "479F46")

после тестирования, это решает проблему в iOS 10.x и 11.x

GIF:

enter image description here

...