22

我在 UINavigationBar 上方添加 UISearchBar 并设置 UIsearchbar showsCancelButton YES,在 iOS6 中工作正常,但在 iOS7 中不显示取消按钮。我使用了下面的代码片段

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 600, 44)];
searchBar.showsCancelButton = YES;
searchBar.translucent = NO;
[searchBar setTintColor:[UIColor redColor]];
searchBar.backgroundColor = [UIColor yellowColor];
[self.navigationController.navigationBar   addSubview:searchBar];
4

7 回答 7

44

出于某种原因,iOS7 在添加到导航栏时不显示取消按钮。如果您尝试将其设置为 navigationItem 的 titleView,也会发生这种情况。

您可以通过首先将 UISearchBar 包装在另一个 UIView 中来规避此问题。这是我作为titleView的做法:

UISearchBar *searchBar = [UISearchBar new];
searchBar.showsCancelButton = YES;
[searchBar sizeToFit];
UIView *barWrapper = [[UIView alloc]initWithFrame:searchBar.bounds];
[barWrapper addSubview:searchBar];
self.navigationItem.titleView = barWrapper;
于 2013-09-27T14:24:16.233 回答
6

我有类似的问题,在带有取消按钮的 iPhone 搜索栏上显示良好,但在 iPad 上没有显示取消按钮。将 UIsearchBar 包装到 UIView 就像 @Rodskjegg 抛出样式问题。在 iPad UIsearchBar 上将其设置为 navigationItem 的 titleView 并将 UIBarButtonItem 添加到 setRighttBarButtonItem 作为 UIBarButtonSystemItemCancel。

    [self.navigationItem setLeftBarButtonItem:Nil animated:YES];
    self.navigationItem.titleView = self.searchBar;

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
    {
        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(searchBarCancelButtonClicked:)];

        [self.navigationItem setRightBarButtonItem: cancelButton animated:YES];
    }
    else {
        [self.navigationItem setRightBarButtonItem: nil animated:YES];
    }
于 2014-08-25T10:05:39.723 回答
4

从 iOS 7 开始,您只需将属性设置displaysSearchBarInNavigationBarYESon 即可在 NavigationBarUISearchDisplayController中自动获取 a 。UISearchbar

于 2013-11-15T12:53:36.200 回答
4

是 在 iOS 7 中,按钮位于屏幕上,但它的标题可能不可见 我的解决方案是将搜索样式设置为“最小”并在 IB 中为“取消”文本颜色选择条形颜色

在此处输入图像描述

模拟器中的结果:

在此处输入图像描述

于 2013-12-05T18:49:38.930 回答
3

我遇到了同样的问题,这是我的解决方案,希望对您有所帮助。

一些进一步的解释:我发现发送setShowsCancelButton:animated:到 searchBar,它就像魔术一样工作。而将searchBar添加到导航栏最简洁的方法是self.navigationItem.titleView = self.searchBar;调用的适当时机setShowsCancelButton:animated:searchBarTextDidBeginEditing:searchBarTextDidEndEditing:委托方法中,所以记得设置self为searchBar的委托。

- (void)viewDidLoad
{
    self.navigationItem.titleView = self.searchBar;
}

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsCancelButton:YES animated:YES]; 
}

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsCancelButton:NO animated:YES];
}
于 2014-08-21T19:54:22.620 回答
2

我遇到了同样的问题,在 iPhone 上搜索取消显示得很好,但在 iPad 上却没有。

将 UISearchBar 包装在另一个 UIView 中的解决方法对我来说效果不佳,因为它在旋转时具有不同的外观和错误的宽度。

我的解决方案很简单——使用不取消的搜索,并将取消添加为 UIBarButtonItem。

于 2015-11-08T07:12:02.940 回答
0

实现搜索栏委托并使用它:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    searchBar.showsCancelButton = YES;
}
于 2014-12-04T13:50:14.583 回答