2009-10-23 60 views
2

我似乎无法让UISearchBar从导航栏中最左边到最右边的位置。在 - (无效)viewDidLoad方法中,我有以下代码:UISearchBar和UINavigationItem

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

当你构建和运行,它乍看上去就好了。然而,仔细观察,你可以看到左边有一个空白/空格。这对于事物的宏伟计划来说不是什么大问题,但是当我点击搜索栏开始搜索时,我将取消按钮设置为视图的动画。因为搜索栏略微位于右侧,动画是生涩和取消按钮脱落,像这样的结尾: link text

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

回答

1

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

标签栏控制器 - >导航控制器 - >视图控制器(一个或多个)

在考虑中的搜索栏是在一个视图控制器,这又是在导航控制器中,哪个导航控制器在标签栏中。

我随便看了斯坦福大学CS 193P(2009春季)的课程,而在第13讲结束时,答案可能已经提出。艾伦Cannistraro指出,存在应用程序的结构应具有这样的结构:

this structure http://img143.imageshack.us/img143/6/viewcontrollerstructure.jpg

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

0

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

+0

我试过了UISearchDisplayController。但是,该“控制”将搜索栏放在表格标题中(不搜索时),而不是导航栏。然后,当您点击搜索栏时,它会动画并移动到导航栏,类似于“联系人”搜索。我不喜欢那样。我希望它看起来就像AppStore搜索一样,无论您正在搜索或不搜索,导航栏中的搜索栏REMAINS。这可能吗? – tbehunin 2009-10-23 19:22:24

+0

从iPhone SDK获取“默认情况下,导航栏左侧显示后退按钮,中间显示标题,您可以通过指定自定义左侧视图,中央视图或右侧视图来更改此行为。”所以也许你可以尝试左视图和中心视图。是否有必要有一个真正的NavigationBar或仅仅是它的外观? – caahab 2009-10-23 20:27:19

+0

我尝试了一个自定义的左视图和中心视图,但仍然看起来不像AppStore搜索。 我知道它看起来像一个导航栏,通过隐藏真正的导航栏,并将搜索放在表视图的标题。这工作完美。唯一的问题是,现在具有搜索栏的标题与屏幕一起滚动。我希望它像导航栏一样静止。任何其他想法?我只是想让搜索看起来像AppStore的搜索。我不敢相信这很难做到。 :( – tbehunin 2009-10-23 22:40:12

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方法,而不是初始化。我不知道为什么这会有所作为,但确实如此。

显然它是关于时间。让它在loadView中停止为我工作,但将它放在viewWillAppear中(当然,只有一次检查才能完成)。我认为这个想法是在一些初始化完成后设置titleView。

2

下面的代码隐藏的导航栏只为这UIViewController中:

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

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

所以得到的UISearchBar在UINavigationBar的的榜眼秀,你的根视图控制器上只是有你的搜索栏在导航栏会一般!