2015-01-15 6 views
2

Я хочу иметь searchBar в таблицеView, который скрыт по умолчанию, но если пользователь отключается, он появляется.Как скрыть таблицуView searchBar

Таким образом, я использовал следующий код для его реализации, но когда представление отображается в первый раз, наглядное отображение SearchBar видно, и я хотел бы избежать этой кратковременной вспышки. Добавление self.tableView.contentOffset = CGPointMake(0, 0) к методу viewDidLoad() не влияет. Обратите внимание, что tableView находится за контроллером навигации, поэтому установка Y offset to 0 эффективно скрывает SearchBar за панель навигации. Любая идея, как убедиться, что headerView tableView скрыт, когда сначала отображается представление.

Я рассмотрел просто удаление headerView, но затем пользователь не может перетащить его для доступа.

override func viewDidLoad() { 
    super.viewDidLoad() 

    searchBar.delegate = self 
    searchBar.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 44) 
    if let tv = self.tableView { 
     if let headerView = tv.tableHeaderView { 
      headerView.addSubview(searchBar) 
     } else { 
      FLOG("No table header view is available so create one!") 
      let headerView = UIView() 
      let width: CGFloat = tv.frame.size.width 
      headerView.frame = CGRectMake(0, 0, width, 44); 
      tv.tableHeaderView = headerView 
      tv.tableHeaderView!.addSubview(searchBar) 
     } 
    }   
} 
override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    dispatch_after(0, dispatch_get_main_queue()) { 
     self.tableView.contentOffset = CGPointMake(0, 0) 
    } 
} 

ответ

0

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

Итак, я полагаю, на своем первом запуске вид нагрузки через mainQueue с viewDidLoad, который помещает свой бар поиска в (0,44), то viewWillAppear вызывается, но на самом деле вызывает краткий визуальный всплеск в связи с вызовом, чтобы переместить смещение таблицы на mainQueue. Но при последующих вызовах, поскольку viewDidLoad уже произошло, вызывается только viewWillAppear. А так как строка поиска сначала не начинается с (0,44), а затем ей нужно переместиться на (0,0), нет никакого промаха.

Вместо того, чтобы напрямую определять рамку для строки поиска, попробуйте позвонить sizeToFit после ее добавления в таблицуHeader. Во-вторых, я не считаю, что вам нужно создать представление заголовка, просто установите его равным поисковой панели. И наконец, вызовите вызов contentOffset из dispatch_queue, он должен быть правильно обработан viewWillAppear как есть.

Недавно я углубился в UISearchController для iOS8 и задокументировал путешествие (по крайней мере, частично). Для кода, который я использовал, here's a link to the implementation file и corresponding write-up я сделал. Он находится в ObjC, поэтому вам нужно сделать небольшой перевод. Но это выглядит так:

self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.filteredResultsTableViewController]; 
self.searchBar = self.searchController.searchBar; 

// other code ... 

[self.searchBar sizeToFit]; 

// other code ... 

self.tableView.tableHeaderView = self.searchBar; 
+0

Спасибо, однако, когда я называю 'contentOffset' в 'viewWillAppear' напрямую, он вообще не работает. Я нашел другое сообщение, где они получили его, используя «отправку». Это похоже на новое поведение для iOS8.x. Вскоре я посмотрю на другие предложения. –

+0

Кстати, вы правы в том, что «viewDidLoad» получает один раз, и «viewWillAppear» вызывается всякий раз, когда вид становится видимым. –

+0

Я также забыл упомянуть, что позже я добавляю еще один вид в headerView, поэтому я не использую сам searchBar. Однако это не должно влиять на отображение. –

Смежные вопросы