【问题标题】:UISearchBar and UINavigationItemUISearchBar 和 UINavigationItem
【发布时间】:2009-10-23 16:54:04
【问题描述】:

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

【问题讨论】:

    标签: iphone uisearchbar uinavigationitem


    【解决方案1】:

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

    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。

    【讨论】:

      【解决方案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 的位置,在您的根视图控制器上,只需将您的搜索栏放在导航栏通常所在的位置!

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 我尝试了 UISearchDisplayController。但是,该“控件”将搜索栏放在表格标题中(不搜索时),而不是导航栏。然后,当您点击搜索栏时,它会动画并向上移动到导航栏,类似于联系人搜索。我不喜欢那样。我希望它看起来就像 AppStore 搜索一样,搜索栏保留在导航栏中,无论您当前是否正在搜索。这可能吗?
          • 取自 iPhone SDK "导航栏默认在左侧显示后退按钮,在中心显示标题。您可以通过指定自定义左视图、居中视图或右视图来更改此行为。”所以也许你可以尝试左视图和中心视图。您是否有必要拥有一个真正的 NavigationBar 或者仅仅是它的外观?
          • 我尝试了自定义的左视图和中视图,但看起来仍然不像 AppStore 搜索。通过隐藏真正的导航栏并将搜索放在表格视图的标题上,我让它看起来像一个导航栏。那工作得很好。唯一的问题是现在具有搜索栏的标题随屏幕滚动。我希望它像导航栏一样静止。还有其他想法吗?我只是想让搜索看起来像 AppStore 搜索。我不敢相信这很难做到。 :(
          • 我认为 Apple 调整了 UISearchDisplayController 以使搜索栏以某种方式保留在导航栏中。他们是如何做到的仍然是个谜。
          猜你喜欢
          • 2018-06-16
          • 1970-01-01
          • 1970-01-01
          • 2010-12-31
          • 2012-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多