我似乎无法让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搜索在导航栏中有一个搜索栏,它一直到边缘。任何人都知道如何让搜索栏一直到边缘,这样我的幻灯片取消按钮动画才能正常工作?

有帮助吗?

解决方案 3

我想我找到了答案 - 虽然我没有经过测试验证。在上面提到的问题中,我有以下结构:

标签栏控制器 - >导航控制器 - >查看控制器

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

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

此结构http://img143.imageshack.us/img143/6/viewcontrollerstructure .JPG

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

其他提示

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

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。

以下代码仅为此UIViewController隐藏了navigationBar:

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

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

为了让UISearchBar显示在UINavigationBar的位置,在你的根视图控制器上只需要你的搜索栏,导航栏就是正常的!

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top