UISearchBar обрезается по строке статуса при добавлении в UISearchDisplayController

Я хочу, чтобы моя панель поиска рисовала свой фон вверх под строкой состояния следующим образом:

enter image description here

Это соответствующий код для изображения выше:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.searchBar = [[UISearchBar alloc] init];
    self.searchBar.delegate = self;
    [self.view addSubview:self.searchBar];

    self.searchBar.translatesAutoresizingMaskIntoConstraints = NO;
    NSDictionary *views = @{@"v":self.searchBar,
                            @"topLayoutGuide":self.topLayoutGuide};

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topLayoutGuide][v]" options:0 metrics:nil views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v]|" options:0 metrics:nil views:views]];

    [self.searchBar setBackgroundImage:[UIImage imageNamed:@"searchbarBG"] forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault];
}

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
    return UIBarPositionTopAttached;
}

Проблема возникает, когда я добавляю строку поиска к UISearchDisplayController, добавляя следующую строку в конце метода viewDidLoad:

self.mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];

В результате я получаю:

enter image description here

Обратите внимание, что изображение выглядит обрезанным. Это отличается от того, на что похоже, если я изменил UIBarPositionTopAttached на UIBarPositionTop в коде:

enter image description here

Обрезанное изображение заставило меня думать о clipsToBounds, и я мог бы заставить панель поиска правильно отображать, добавив этот фрагмент кода в конец viewDidLoad:

for (UIView *subview in self.searchBar.subviews) {
    subview.clipsToBounds = NO;
}

Итак, я думаю, что UISearchDisplayController возится с свойством clipsToBounds фонового представления UISearchBar. Кто-нибудь еще боролся с этим? Есть ли проблема с моим кодом?

Обновление:

В октябре 2013 года, помимо публикации этого вопроса, я также сообщил об этом с помощью инструмента Apple Bug Reporter. 6 января 2015 года (waaaay слишком поздно) я получил ответ от Apple Developer Relations:

Нет никаких планов по устранению этого, основываясь на следующем:

UISearchDisplayController больше не поддерживается. Желаемый функциональность должна быть доступна с помощью UISearchController, а если нет (или ведет себя некорректно), пожалуйста, напишите новую ошибку.

Мы закрываем этот отчет.

Если у вас есть вопросы о разрешении или если это все еще критическая проблема для вас, то, пожалуйста, обновите свой отчет об ошибке информация.

Пожалуйста, регулярно проверяйте новые выпуски Apple для любых обновлений что может повлиять на эту проблему.

Ответ 1

У меня была одна и та же проблема, но заставляя clipToBounds для YES для searchBar, сделал трюк. Нет необходимости в автоматической компоновке или методах протокола UIBarPositioning.

Ответ 2

Вы согласны с протоколом UIBarPositioningDelegate и должным образом становитесь делегатом для своего SearchBar, реализуете метод делегата как таковой

-(UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }