Скрыть UISearchBar до прокрутки пользователя?

Я реализовал панель поиска и контроллер отображения в верхней части таблицы.

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

Есть ли простой способ скрыть его до тех пор, пока пользователь не прокрутит вниз, как это происходит в приложении "Музыка"?

Ответ 1

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

[self.tableView setContentOffset:CGPointMake(0,44) animated:YES];//or (0, 88) depends on the height of it

Для контроллера отображения поиска вы также можете попробовать это,

[self.searchDisplayController setActive:NO animated:YES];

Ответ 2

другой подход без жесткого кода

[self.tableView setContentOffset:CGPointMake(0.0, self.tableView.tableHeaderView.frame.size.height) animated:YES];

Ответ 3

После нескольких часов вытягивания волос, что-то, что работает

  • на iOS 9
  • не зависит от количества строк в таблице
  • с переменными строками высоты

    С учетом строки поиска находится tableView.tableHeaderView

    @interface MyTableViewController ()
    
    @property (nonatomic, assign) BOOL firstLayout;
    
    @end
    
    - (void) viewDidLoad {
    [super viewDidLoad];
    
    
    self.firstLayout = YES;
    //your code
    
    }
    
    -(void)viewDidLayoutSubviews{
    
    [super viewDidLayoutSubviews];
    
    if(self.firstLayout){
    CGPoint offset = CGPointMake(0, self.tableView.tableHeaderView.frame.size.height - self.tableView.contentInset.top);
    [self.tableView setContentOffset:offset];
    
        self.firstLayout = NO;
    
    }
    
    }
    

Ответ 4

для iOS 7 и используя UINavigationController

[self.tableView setContentOffset:CGPointMake(0, self.searchBar.height + self.navigationController.navigationBar.height)];

Ответ 5

Лучший способ перезагрузить таблицу в

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:YES];     
    [self performSelector:@selector(reload:) withObject:nil afterDelay:0.0];
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

- (void)reload:(__unused id)sender {
        [self.searchDisplayController setActive:YES];
        [self.tableView reloadData];
        [self.refreshControl endRefreshing];
    } else {
        [self.refreshControl endRefreshing];
        [[[UIAlertView alloc]initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
    }
}

Спасибо

Ответ 6

Это отлично работает на iOS9 +

- (void)viewDidLoad {
    [super viewDidLoad];

    dispatch_async(dispatch_get_main_queue(), ^{
        self.tableView.contentOffset = CGPointMake(0, -20);
    });
}