UISearchBar到UISearchDisplayController的转换是20px

时间:2014-05-05 19:29:39

标签: ios objective-c uisearchbar uisearchdisplaycontroller

我在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,以使其更清楚地发生了什么。

Gap

过渡的视频捕捉:http://cl.ly/0y3L0Z1R1I0c/20pixels.mov

我尝试过的事情:

  1. 在searchDisplayControllerWillBeginSearch上更改我的UITableView的框架,将其向上移动20px。这打破了过渡。 http://cl.ly/033q0L3G0p1T/origin.mov
  2. 在searchDisplayControllerWillBegin上更改UITableView上的滚动偏移。同样,这也打破了转型。
  3. 尝试手动设置UISearchBar的动画,但我也无法使其工作。
  4. 有什么想法吗?

3 个答案:

答案 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}}开始编辑时被推下来。