我在UITableView的顶部实现了一个UISearchBar。
在我的ViewDidLoad中,我设置了self.edgesForExtendedLayout = UIRectEdgeNone
。
这是我如何添加我的UISearchBar。我只是将UISearchBar添加到我的UITableView的标题并调整内容偏移量:
// Table View
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.screenWidth, self.screenHeight)];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// Customize table appearance
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
self.tableView.backgroundColor = [UIColor tableBackgroundColor];
// Define the table's datasource
self.tableView.dataSource = self;
self.tableView.delegate = self;
[self.view addSubview:self.tableView];
// Add a search bar to the header
self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.screenWidth, 44)];
self.searchBar.tintColor = [UIColor primaryBrandedColor];
self.searchBar.placeholder = NSLocalizedString(@"Search", "Search placeholder");
self.searchBar.backgroundImage = [UIImage imageNamed:@"searchBarBackground"];
[self.searchBar setBackgroundImage:[UIImage imageNamed:@"searchBarBackground"] forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault];
self.searchBar.barTintColor = [UIColor clearColor];
self.searchBar.delegate = self;
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"Whitney-Light" size:15]];
//Setup search display controller
self.searchController = [[HUMSearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
self.searchController.delegate = self;
self.searchController.searchResultsDataSource = self;
self.searchController.searchResultsDelegate = self;
self.searchController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
// Add the searchBar and offset the table view so it's hidden by default.
self.tableView.tableHeaderView = self.searchBar;
self.tableView.contentOffset = CGPointMake(0.0, self.searchBar.frame.size.height);
看起来似乎没有任何异常,但是当显示SearchDisplayController时,原始tableview上有20px的差距。在这个例子中,我已经将SearchDisplayController子类化为不隐藏NavigationBar,以使其更清楚地发生了什么。
过渡的视频捕捉:http://cl.ly/0y3L0Z1R1I0c/20pixels.mov
我尝试过的事情:
有什么想法吗?
答案 0 :(得分:3)
经过几次试错会后,我终于达到了预期的行为。在我的情况下请注意,当单击搜索栏时,我希望导航栏被向上推。以下解决方案修复了20px间隙问题。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
...
self.edgesForExtendedLayout = UIRectEdgeTop;
self.searchBar.clipsToBounds = YES;
self.navigationController.navigationBar.translucent = YES;
}
在viewWillDisappear
上,半透明属性需要设置为NO,否则在segue视图中,控制器导航栏将保持与视图内容一起推送。
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self resignFirstResponder];
self.navigationController.navigationBar.translucent = NO;
}
希望这有帮助。
答案 1 :(得分:0)
\ me waves at Aaron
这是在我的头撞到墙上之后,为我们工作的结果。请注意,我们将使用搜索栏显示导航栏。
注意:这很可能会在iOS 8上破解,因为它会根据我使用Reveal找到的一些内容进行观看,所以如果有人有一个不那么脆弱的解决方案,我和#39;我喜欢听到它。
- (UIView *)wrapperViewForTableView:(UITableView *)tableView
{
//This was discovered via Reveal. May change for iOS 8.
return tableView.subviews[1];
}
- (CGFloat)statusBarHeight
{
return CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]);
}
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
//Don't animate - this bit works without animation.
UIView *wrapperView = [self wrapperViewForTableView:self.tableView];
CGRect frame = wrapperView.frame;
frame.origin.y -= [self statusBarHeight];
frame.size.height += [self statusBarHeight];
wrapperView.frame = frame;
}
- (void)searchDisplayControllerWillEndSearch:(HUMSearchDisplayController *)controller
{
//Animate this so it goes with the dismissal.
[UIView animateWithDuration:0.25 animations:^{
UIView *wrapperView = [self wrapperViewForTableView:self.tableView];
CGRect frame = wrapperView.frame;
frame.origin.y += [self statusBarHeight];
frame.size.height -= [self statusBarHeight];
wrapperView.frame = frame;
}];
}
答案 2 :(得分:0)
不要直接将UISearchBar
指定为tableHeaderView
,而是创建一个与UIView
大小相同的空UISearchBar
,并将UISearchBar
添加为tableHeaderView
子视图到此视图,您将其指定为UITableView
。
这会阻止UISearchBar
在{{1}}开始编辑时被推下来。