Скрыть панель поиска UITableView - PullRequest
3 голосов
/ 21 марта 2012

У меня есть UITableViewController с настройкой UISearchDisplayController стандартным способом (с панелью поиска внутри tableView).Я бы хотел, чтобы панель поиска начиналась скрытой - действительно скрытой, а не просто прокручиваемой , как в этом решении .Затем я хотел бы представить пользовательский интерфейс поиска, когда пользователь нажимает кнопку, и скрывать ее снова (действительно скрывать) после того, как пользователь выбирает один из элементов, найденных в поиске.

Вот почти рабочий коддля этого:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.searchDisplayController.searchBar.prompt = @"Add an item";
    self.searchDisplayController.searchBar.placeholder = @"Type the item name";

    // i do this to trigger the formatting logic below
    [self.searchDisplayController setActive:YES animated:NO];
    [self.searchDisplayController setActive:NO animated:NO];
    // rest of my view will appear
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {

    NSTimeInterval duration = (self.isViewLoaded && self.view.window)? 0.3 : 0.0;
    __block CGFloat searchBarHeight = controller.searchBar.frame.size.height;

    [UIView animateWithDuration:duration animations:^{
        self.tableView.contentOffset = CGPointMake(0, searchBarHeight);
        self.tableView.contentInset = UIEdgeInsetsMake(-searchBarHeight, 0, 0, 0);  // trouble here, I think
    } completion:^(BOOL finished) {
        controller.searchBar.hidden = YES;
    }];
}

, чтобы показать

- (IBAction)pressedAddButton:(id)sender {

    self.searchDisplayController.searchBar.hidden = NO;
    [self.searchDisplayController setActive:YES animated:YES];
}

Я думаю, что я правильно устанавливаю вставку содержимого, но это ведет себя неожиданно: с кодом, как показано, таблица позволяет содержимомупереместиться слишком далеко, то есть, имея только два не очень высоких ряда, я могу прокрутить вниз, толкая большинство этих двух рядов над верхней частью таблицы ... как будто нет отскока снизу.Когда я закомментирую строку contentInset, таблица позволяет мне переместить содержимое слишком далеко, оставляя большой пробел над строкой 0, предположительно там, где скрыта строка поиска.

Сильно благодарен, если кто-то может помочь.

Ответы [ 3 ]

11 голосов
/ 22 марта 2012

Для всех, у кого может быть эта проблема (которая, похоже, никем) -

Единственный путь, который я смог найти, - это отказаться от UITableViewController в пользу UIViewController с пользовательским интерфейсом, чьи дети являются таблицейПанель просмотра и поиска.

Я управляю макетом, как указано выше:

- (void)setSearchHidden:(BOOL)hidden animated:(BOOL)animated {

    UISearchBar *searchBar = self.searchDisplayController.searchBar;
    CGFloat searchBarHeight = searchBar.frame.size.height;

    CGFloat offset = (hidden)? -searchBarHeight : searchBarHeight;
    NSTimeInterval duration = (animated)? 0.3 : 0.0;

    [UIView animateWithDuration:duration animations:^{
        searchBar.frame = CGRectOffset(searchBar.frame, 0.0, offset);
        self.tableView.frame = UIEdgeInsetsInsetRect(self.tableView.frame, UIEdgeInsetsMake(offset, 0, 0, 0));
    } completion:^(BOOL finished) {if (!hidden) [searchBar becomeFirstResponder];}];
}

За исключением метода, который вызывается при запуске и завершении функции добавления.

(О программедва раза в год я прихожу к выводу, что UITableViewController доставляет больше хлопот, чем стоит. Затем, примерно на той же частоте, я забываю, что узнал об этом).

0 голосов
/ 18 августа 2016

Если в вашей таблице достаточно записей, вы можете сделать следующее:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

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

0 голосов
/ 21 марта 2012

Переход с альфа-подхода: 1001 *

[controller.searchBar setAlpha:0.0]; 

или

[controller.searchBar setAlpha:1.0]; 
...