Iphone UISearchBar和UINavigationItem

Iphone UISearchBar和UINavigationItem,iphone,uisearchbar,uinavigationitem,Iphone,Uisearchbar,Uinavigationitem,我似乎无法让UISearchBar在导航栏中从最左侧到最右侧进行定位。在-(void)viewDidLoad方法中,我有以下代码: UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame]; sb.delegate = self; self.navigationItem.titleView = sb; [sb sizeToFit]; [sb release]; 当您构建并

我似乎无法让UISearchBar在导航栏中从最左侧到最右侧进行定位。在-(void)viewDidLoad方法中,我有以下代码:

UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame];
sb.delegate = self;
self.navigationItem.titleView = sb;
[sb sizeToFit];
[sb release];
当您构建并运行时,乍一看它看起来很好。但是,仔细观察,您可以发现左侧有一个边距/空格。这在宏伟的计划中并不是什么大问题,但当我点击搜索栏开始搜索时,我会在视图中设置取消按钮的动画。因为搜索栏稍微向右定位,所以动画不稳定,“取消”按钮从末端脱落,如下所示:


看起来UINavigationItem就像一个有三个单元格的表格,第一个单元格和最后一个单元格上有一个我无法删除的填充,似乎也没有办法“合并”所有单元格,然后将搜索栏放在那里。我知道这是可能的,因为AppStore搜索在导航栏中有一个搜索栏,它一直延伸到边缘。有人知道如何让搜索栏一直移动到边缘,这样我的“取消”按钮幻灯片动画就可以正常工作了吗?

也许苹果正在使用UISearchDisplayController来完成这些事情。

实际上,有一个非常简单的解决方案。您所要做的就是为背面项目创建零宽度视图:

UIView *hackView = [[UIView alloc] initWithFrame:CGRectZero];
UIBarButtonItem *hackItem = [[UIBarButtonItem alloc] initWithCustomView:hackView];      
self.navigationItem.backBarButtonItem = hackItem;
[hackView release];
[hackItem release];

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[searchBar sizeToFit];
self.navigationItem.titleView = searchBar;
[searchBar release];
请确保在loadView方法中执行此操作,而不是在init中。我不知道为什么会有不同,但确实如此


显然是时间问题。将它放在loadView中对我来说已经不起作用了,但将它放在ViewView中似乎会起作用(当然,还有一个复选框,这样它只能执行一次)。我想这个想法是在初始化完成后设置标题视图。

我想我找到了答案-尽管我还没有测试验证。在我上面提供的问题中,我有以下结构:

选项卡栏控制器->导航控制器->视图控制器

所讨论的搜索栏位于视图控制器中,视图控制器位于导航控制器中,导航控制器位于选项卡栏中

我当时正在随意观看斯坦福CS 193P(2009年春季)课程,在第13课结束时,答案可能已经给出了。Alan Cannistraro表示,状态应用程序的结构应具有以下结构:


其中,底部视图控制器(与选项卡栏控制器相邻)是具有搜索栏控件的视图控制器。他警告说,如果不这样做,你会“遇到问题”。可能是我面临的问题?我相信是这样。

以下代码仅为这个UIViewController隐藏了导航栏:

- (void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

因此,要使UISearchBar显示在UINavigationBar的位置,在根视图控制器上,只需将搜索栏放在导航栏通常所在的位置

我试过UISearchDisplayController。但是,该“控件”将搜索栏放在表格标题中(不搜索时),而不是导航栏。然后,当您点击搜索栏时,它会设置动画并向上移动到导航栏,类似于联系人搜索。我不喜欢那样。我希望它看起来就像AppStore搜索一样,搜索栏保留在导航栏中,不管您当前是否正在搜索。这可能吗?摘自iPhone SDK“导航栏在左侧显示后退按钮,默认情况下标题显示在中间。您可以通过指定自定义左视图、中视图或右视图来更改此行为。”因此,您可以尝试左视图和中视图。你有必要拥有一个真正的导航栏,还是仅仅是它的外观?我尝试了一个自定义的左视图和中视图,但看起来仍然不像AppStore搜索。通过隐藏真正的导航栏并将搜索放在表视图的标题上,我使它看起来像一个导航栏。这非常有效。唯一的问题是,现在带有搜索栏的标题会随着屏幕滚动。我希望它像导航条一样静止不动。还有其他想法吗?我只是希望搜索看起来像AppStore搜索。真不敢相信这么难做到(我认为苹果调整了UISearchDisplayController,以使搜索栏以某种方式保留在导航栏中。他们是如何做到的仍然是个谜。