我想在tableView中有一个默认隐藏的searchBar,但是如果用户下拉它会出现。
所以我使用了下面的代码来实现这个,但是当第一次显示视图时,searchBar暂时可见,我想避免这个简短的闪存。将self.tableView.contentOffset = CGPointMake(0, 0)
添加到viewDidLoad()
方法没有任何影响。请注意,tableView位于导航控制器后面,这就是为什么将Y偏移设置为0有效地隐藏了导航栏后面的searchBar。知道如何确保在首次显示视图时隐藏tableView的headerView。
我考虑过只删除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 :(得分:0)
我认为viewWillAppear
和viewDidLoad
存在排序问题。据我所知,每次绘制视图并将其添加到视图层次结构时都会调用viewWillAppear
,而当VC首次加载其子视图时会调用viewDidLoad。
所以,我想在你第一次运行视频时会通过mainQueue
加载viewDidLoad
将搜索栏置于(0,44),然后viewWillAppear
被调用但实际上会导致由于调用移动表格在mainQueue上的偏移量而产生的短暂视觉短片。但是在后续调用中,由于viewDidLoad
已经发生,因此只会调用viewWillAppear
。并且由于搜索栏不是首先从(0,44)开始然后需要移动到(0,0),所以没有blip。
不是直接为搜索栏定义框架,而是在将其添加到tableHeader后尝试在其上调用sizeToFit
。其次,我不相信你必须实例化标题视图,只需将其设置为等于搜索栏即可。最后,从dispatch_queue中取出contentOffset
调用,它应该由viewWillAppear
按原样正确处理。
我最近深入了解iOS8的UISearchController,并记录了这段旅程(至少部分)。对于我使用的代码,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;