当 UISearchBar 变为活动状态时调整 UIToolbar 的大小

Posted

技术标签:

【中文标题】当 UISearchBar 变为活动状态时调整 UIToolbar 的大小【英文标题】:Resizing UIToolbar when UISearchBar becomes active 【发布时间】:2012-12-13 19:31:58 【问题描述】:

我有一个UIToolbar,里面有 5 个项目:

    UIBarButtonItem 带图片 UIBarButtonItem伸缩宽度 UIBarButtonItem 带有自定义视图 (UISearchBar) UIBarButtonItem 伸缩宽度 UIBarButtonItem 带图片

当我选择UISearchBar 时,我让它保持正确的大小并变为活动状态。但是,我希望左侧和右侧的图像消失,并为UISearchBar 提供UIToolbar 的全宽。我该怎么做?

这就是我所拥有的: https://dl.dropbox.com/u/3077127/demo_1.mov

这就是我想要的: https://dl.dropbox.com/u/3077127/demo_2.mov

这是我的代码:

#pragma mark View lifecycle

- (void)viewDidLoad 
[...]

    SearchBar *mySearchBar = [[SearchBar alloc] init];
    mySearchBar.delegate = self;
    [mySearchBar sizeToFit];
    [mySearchBar setAutocapitalizationType:UITextAutocapitalizationTypeNone];
    [mySearchBar setTintColor:[UIHelpers getSlColor]];

    CGRect searchBarFrame = mySearchBar.frame;
    searchBarFrame.size.width = 218;
    [mySearchBar setFrame:searchBarFrame];

    UIView *searchBarContainer = [[UIView alloc] initWithFrame:mySearchBar.frame];
    [searchBarContainer addSubview:mySearchBar];
    [searchBarContainer setTag:99];

    UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"location-arrow"] style:UIBarButtonItemStyleBordered target:self action:nil];
    UIBarButtonItem *right = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"location-arrow"] style:UIBarButtonItemStyleBordered target:self action:nil];
    UIBarButtonItem *flex = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    UIBarButtonItem *search = [[UIBarButtonItem alloc] initWithCustomView:searchBarContainer];

    NSArray *items = [[NSArray alloc] initWithObjects:left, flex, search, flex, right, nil];

    UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    [toolbar setItems:items];
    [toolbar setTintColor:[UIHelpers getSlColor]];

    self.tableView.tableHeaderView = toolbar;
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectNull];

[...]

    [super viewDidLoad];


#pragma mark -

【问题讨论】:

嘿,在这里查看我的 SO 答案link,这与您尝试做的类似。 这似乎有效。但是,我不使用界面生成器,而是通过代码完成所有操作......这也应该可以。将您的回复添加为答案,我会批准。 很高兴能提供帮助 :) 将其作为答案发布。 【参考方案1】:

这是我对here发布的类似问题的回答

正确动画的关键是指定UIViewAnimationOptionLayoutSubviews 作为动画的选项。

【讨论】:

【参考方案2】:

不确定您是否尝试过,但也许您可以使用UISearchBarDelegate 方法在用户点击搜索栏时获得通知。

例子:

    #pragma mark - UISearchBarDelegate Methods

    - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar 
      // Remove the right and left buttons from the ToolBar
      [self updateToolBarWithImages:NO];
    

    - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar 
      // Add back the right and left buttons to the ToolBar
      [self updateToolBarWithImages:YES];
    


    #pragma mark - Private Methods

    // Custom method used to Update the ToolBar
    - (void)updateToolBarWithImages:(BOOL)iShowImages 
      // Logic to update ToolBar based on the BOOL value in showImages
      // use "setItems:animated:" method of UIToolBar to set the ToolBar Items
      [toolBar setItem:items animated:YES];
    

【讨论】:

我曾尝试更新工具栏,但如果我没记错的话它并不顺利。由于工具存在一个包含项目的数组,因此更新项目会导致突然更新(不是动画)或根本不发生。 你试过UIToolBar的- (void)setItems:(NSArray *)items animated:(BOOL)animated;方法来设置ToolBar Items吗?相应地更新了答案。希望这会有所帮助。 我想我做到了,但我目前不确定。我今晚一回到家就试试看是否有效。 不幸的是,它没有给我想要的结果。【参考方案3】:

您不应该为此使用工具栏。 只需使用带有 2 个左右 ButtonItem 的 NavigationBar,并在 NavigationBar 的 titleView 中添加一个带有适当代理的 SearchBar。

因此您不必调整 NavigationBar 的大小。这只是添加/删除 NavigationBar 的左右 ButtonItems 动画,如下所示:

if (self.searchBar.isActive) 
     [self.navigationItem setLeftBarButtonItem:nil animated:YES];
     [self.navigationItem setRightBarButtonItem:nil animated:YES];

else 
    [self.navigationItem setLeftBarButtonItem:self.leftButton animated:YES];
    [self.navigationItem setRightBarButtonItem:self.rightButton animated:YES];

希望这会有所帮助!

【讨论】:

以上是关于当 UISearchBar 变为活动状态时调整 UIToolbar 的大小的主要内容,如果未能解决你的问题,请参考以下文章

当 UISearchBar 变为活动状态时,UISearchResultsTableView 不会出现

当 UISearchBar 处于活动状态时,滚动到 UITableView 应用程序会崩溃

UISearchBar 在活动时与 UITableView 内容重叠

呈现搜索结果控制器时 UISearchBar 的高度不正确

Android - 当键盘为 android 5.0 (棒棒糖) 启动时调整滚动视图

Objective-C - 滚动时 UISearchController 结果在 UISearchBar 上重叠