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

UISearchBar перемещается на 20 пикселей

У меня есть UITableViewController T, который содержит UISearchDisplayController и UISearchBar стандартным способом (все, что определено в nib). T затем содержится в качестве контроллера детского представления стандартным способом каким-либо другим контроллером представления.

Строка поиска отображается правильно:

normal search bar

Но когда я нахожусь в строке поиска, действительно ищу, строка поиска становится выше, а содержимое внутри строки поиска падает примерно на 20 пикселей (er, высота совпадения в строке состояния?) Например:

weird search bar is too tall

Что с этим? Он слишком высокий. Кроме того, анимация, которая делает его похожим, неуклюжа. Любой способ предотвратить этот неприглядный рост?

4b9b3361

Ответ 1

Мне удалось решить очень похожую проблему с тем, который вы испытываете, программно устанавливая UISearchController вверх так:

Примечание ~ Ошибка сохраняется, если для параметра hidesNavigationBarDuringPresentation не установлено значение NO.

#pragma mark - View Life Cycle

- (void)viewDidLoad {
    [super viewDidLoad];

    self.results = [[NSArray alloc] init];

//  1  \\ Results Table View
    UITableView *searchResultsTableView = [[UITableView alloc] initWithFrame:self.tableView.frame];
    [searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:Identifier];
    searchResultsTableView.delegate = self;
    searchResultsTableView.dataSource = self;

//  2  \\ init search results table view & setting its table view
    self.searchResultsTableViewController = [[UITableViewController alloc] init];
    self.searchResultsTableViewController.tableView = searchResultsTableView;
    self.searchResultsTableViewController.view.backgroundColor = [UIColor blackColor];

//  3  \\ init a search controller with it tableview controller for results
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsTableViewController];
    self.searchController.hidesNavigationBarDuringPresentation = NO;    //  √
    self.searchController.searchResultsUpdater = self;
    self.searchController.delegate = self;
    self.searchController.searchBar.barTintColor = [UIColor blackColor];

//  4  \\ Make an appropriate search bar (size, color, attributes) and add it as the header
    [self.searchController.searchBar sizeToFit];
    self.tableView.tableHeaderView = self.searchController.searchBar;
    self.tableView.tableHeaderView.backgroundColor = [UIColor blackColor];

//  5  \\ Enable presentation context
    self.definesPresentationContext = YES;
    self.tableView.backgroundColor = [UIColor clearColor];
    self.currentUser = [PFUser currentUser];
}

Добавлена ​​дополнительная информация:

  • Конструктор интерфейсов: UIViewController (не UITableViewController)
  • Добавьте UITableView с ограничениями:

    а. введите описание изображения здесь

    б. * Моя панель навигации - это настраиваемая высота - ваше "Top Space to: Top Layout Guide" может быть изменено

  • Добавьте выходы Делегат и источники данных из добавленного вида таблицы в UIViewController

    а. Не забывайте делать это программно:

    @interface AddUsersViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
    
    @property (weak, nonatomic) IBOutlet UITableView *tableView;
    
  • В Расширении интерфейса:

    а. Установите делегат UISearchConroller и источник данных:

    #import "AddUsersViewController.h"
    
    #define ResultsTableView self.searchResultsTableViewController.tableView
    #define Identifier @"Cell"
    
    @interface AddUsersViewController () <UISearchControllerDelegate, UISearchResultsUpdating>
    
    @property (nonatomic) UISearchController *searchController;
    @property (nonatomic) UITableViewController *searchResultsTableViewController;
    @property (nonatomic, weak) UIBarButtonItem *leftBarButton;
    @property (nonatomic) NSArray *results;
    
    @end
    

Хотя это сработало для меня, я обнаружил, что существуют другие возможные сценарии, которые могут быть причиной этого. Моя "проблема" заключалась не в том, что строка поиска перемещалась на 20 пикселей (или около того), но она двигалась вверх. Я приписал это настраиваемому заголовку UINavigationBar, который включал заголовок изображения и пользовательские NavBarButtons. Имея это в виду, вот еще два возможных решения:

.

Оригинальные сценарии:

  • Вид контейнера extendedLayoutIncludesOpaqueBars Свойство

    а. Раскадровка: отметьте √ "Under Opaque Bars" для просмотра таблиц в раскадровке.

    б. Программно: yourTableView(s).extendedLayoutIncludesOpaqueBars= YES;

.

  1. Установите scopeButtonTitles в пустой массив. (Ниже)

    self.searchController = UISearchController(searchResultsController: nil);
    self.searchController.searchResultsUpdater = self;
    self.searchController.searchBar.scopeButtonTitles = [];
    self.tableView.tableHeaderView = self.searchController.searchBar;
    

Более поздние два ответа взяты из ЭТО и могут оказаться полезными при проверке тоже.

Благодаря исследованиям и тестированию BananaNeil, он обнаружил, что если вы будете следовать моим рекомендациям и настройте searchController.searchBar.y = 0, ваша панель поиска должна быть именно там, где вы надеялись, что это будет так. √

Ответ 2

Не уверен, что это iOS 9, но установка

searchController.hidesNavigationBarDuringPresentation = NO;

решает вопрос о странном движении вниз UISearchBar во всем содержимом UITableView. Конечно, это отключает навигационную панель - так что это может быть не то, что вы хотите.

Ответ 3

Вместо использования UITableViewController выберите обычный UIViewController и добавьте UITableView в его представление. Добавьте ограничения для привязки к Top Layout Guide.Bottom, Superview.Leading, Superview.Trailing, Bottom Layout Guide.Top. Затем добавьте Search Bar в UITableView.

По какой-то причине панель поиска не работает при реализации таким образом.

Одна из возможных причин может заключаться в том, что при редактировании Search Controller настраивается положение панели поиска, компенсируя высоту руководства Top Layout. Прямое нажатие кнопки "Показать таблицу вверх" на Top Layout Guide.Bottom помогает как-то.

Надеюсь, это поможет!

Ответ 4

Я действительно выяснил свою проблему:

У меня был мой UISearchBar внутри представления оболочки, который я переклассифицировал как прокручиваемый UITableView.

Обертка была 20px выше, чем панель поиска, и я установил searchbar.y = 20 (по стилистическим причинам). Каждый раз, когда я нажимал на панель поиска, она необъяснимо возрастала на 20 пикселей.

В какой-то момент я установил searchBar.y = 10 и заметил, что он вырос только на 10px.

И, конечно же, оказывается, что высота роста searchBar точно равна его y-позиции внутри него непосредственного супервизора. Итак, когда я установил searchbar.y = 0, поисковая панель перестала расти.

Ответ 5

Попробуйте использовать:

yourSearchBar.clipsToBounds = true