2

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

UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame];
sb.delegate = self;
self.navigationItem.titleView = sb;
[sb sizeToFit];
[sb release];

当您构建并运行时,乍一看它看起来还不错。但是,仔细观察,您可以看出左侧有一个边距/空间。这在宏伟的计划中没什么大不了的,但是当我点击搜索栏开始搜索时,我会将取消按钮设置为动画。因为搜索栏的位置稍微偏右,所以动画很生涩,取消按钮会像这样掉下来: link text

似乎 UINavigationItem 就像一个包含三个单元格的表格,其中第一个和最后一个有一个我无法删除的填充 - 似乎也没有办法将它们“合并”在一起然后放置那里的搜索栏。我知道这种外观是可能的,因为 AppStore 搜索在导航栏中有一个搜索栏,它一直延伸到边缘。任何人都知道如何让搜索栏一直走到边缘,这样我的滑入式取消按钮动画才能正常工作?

4

4 回答 4

5

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

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 中停止了对我的工作,但将其放在 viewWillAppear 中是有效的(当然,需要检查一下,以便它只完成一次)。我认为这个想法是在一些初始化已经完成之后设置titleView。

于 2010-03-08T18:05:03.517 回答
2

下面的代码只为这个 UIViewController 隐藏了 navigationBar:

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

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

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

于 2010-05-15T02:07:30.143 回答
1

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

标签栏控制器 -> 导航控制器 -> 视图控制器

有问题的搜索栏位于视图控制器中,而视图控制器又位于导航控制器中,导航控制器位于选项卡栏中。

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

这个结构 http://img143.imageshack.us/img143/6/viewcontrollerstructure.jpg

其中底部视图控制器(与标签栏控制器相邻)是具有搜索栏控件的视图控制器。他警告说,如果不以这种方式完成,您将“遇到问题”。可能是我遇到的问题?我相信是这样。

于 2010-03-16T17:06:29.710 回答
0

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

于 2009-10-23T17:08:36.767 回答