Подтвердить что ты не робот

Настройка UISearchBar: попытка избавиться от черной линии 1px под панелью поиска

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

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

search bar with black bottom line

UPDATE

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

4b9b3361

Ответ 1

Я исправил это, добавив 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 моего класса контроллера.

Ответ 2

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

 searchBar.layer.borderWidth = 1;

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

Ответ 3

Почему:

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

Решение:

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

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

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

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

Ответ 4

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

mySearchBar.searchBarStyle = UISearchBarStyleMinimal;

Ответ 5

Решение для

XCode 10.1 Swift 4.2

enter image description here

Ответ 6

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

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

Ответ 7

Установите 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];

Затем добавьте его в таблицуHeaderView.

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

Ответ 8

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

Если вы подклассом UISearchBar, вы можете переопределить фрейм, как это.

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

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

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

- (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 требуется только для повторного центрирования поля поиска.

UPDATE

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

Ответ 9

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

Вы можете использовать отладчик пони, чтобы выяснить, где находится иерархия subview. Я думаю, что вещь, которую вы видите, - это частный 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;
    }
  } 
}

Ответ 10

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

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

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

GIF:

enter image description here

Ответ 11

Вы можете использовать

  [[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"someImage.png"]forState:UIControlStateNormal];

на iOS 5+, чтобы избавиться от строки.