如何在iOS中模仿Safari的UISearchBar行为

时间:2014-01-03 07:28:00

标签: ios objective-c uinavigationbar uisearchdisplaycontroller

导航栏的UISearchBar中有一个titleView(如下图所示),我希望它能像Safari浏览器中的那样工作。

我没有足够的声誉来发布图片,这是链接

第一张图片

enter image description here

第二张照片

enter image description here

我想要达到的目标是:

  • 在正常状态下,导航栏包含2个左右按钮,UISearchBar和搜索栏内的清除按钮(看起来像带有2个加法按钮的第一张图片)。
  • 在搜索状态下,view被另一个view取代,当它被解雇时,view又回到原始状态。
  • 适用于iOS 6和7

我知道这可以通过使用UISearchDisplayController来完成,但它不起作用。这是我的代码:

.h :实施TableView's DataSource/Delegate, UISearchDisplayDelegate, UISearchBarDelegate

的.m

-(void) viewDidload
{
    //Add left, right buttons
    self.leftButton = [[UIBarButtonItem alloc] init];
    [self.leftButton setStyle:UIBarButtonItemStylePlain];
    [self.leftButton setTitle:@"Button"];
    self.navigationItem.leftBarButtonItem = self.leftButton;

    self.rightButton = [[UIBarButtonItem alloc] init];
    [self.rightButton setStyle:UIBarButtonItemStylePlain];
    [self.rightButton setTitle:@"Button"];

    self.navigationItem.rightBarButtonItem = self.rightButton;
    self.searchBar = [[UISearchBar alloc] initWithFrame:self.navigationController.navigationBar.bounds];
    if (DEVICE_IS_IOS7) {
        self.searchBar.searchBarStyle = UISearchBarStyleMinimal;
    }
    self.navigationItem.titleView = self.searchBar;
    self.searchBar.delegate = self;
    //----------------

    self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
    self.searchController.delegate = self;
    self.searchController.searchResultsDataSource = self;
    self.searchController.searchResultsDelegate = self;
}

    /*
    table implementation
    */

在iOS 7中,view UISearchDisplayController(灰色的)没有覆盖主视图而resultTable没有重新加载数据,即使它能够过滤搜索串。 (我不得不用KVO来显示它)

在iOS 6中,灰色的东西覆盖了所有屏幕,键盘没有显示(它立即消失)。

有人可以帮忙吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

我曾经两次不得不做一个与你所描述的非常相似的用户界面,最近的一个更接近Twitter的iOS 7&#39 {1}行为。如果您想在UISearchBar内显示UISearchBar,请完全忘记该设置,因为您可能会遇到障碍,例如this(尽管it seems fixed by Apple)。

相反假。隐藏UINavigationBar中的导航栏,并为iOS 7使用UIViewController的高度为UIView,为iOS 6使用64并将其置于顶部,以便其显示像导航栏。像普通子视图一样在其中添加44,然后在UISearchBar方法中根据需要设置动画。