添加到UISearchDisplayController时,UISearchBar在状态栏下剪切

alb*_*amg 11 uisearchbar uisearchdisplaycontroller ios ios7

我希望我的搜索栏将其背景向上扩展到状态栏下方,如下所示:

在此输入图像描述

这是上图中的相应代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.searchBar = [[UISearchBar alloc] init];
    self.searchBar.delegate = self;
    [self.view addSubview:self.searchBar];

    self.searchBar.translatesAutoresizingMaskIntoConstraints = NO;
    NSDictionary *views = @{@"v":self.searchBar,
                            @"topLayoutGuide":self.topLayoutGuide};

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topLayoutGuide][v]" options:0 metrics:nil views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v]|" options:0 metrics:nil views:views]];

    [self.searchBar setBackgroundImage:[UIImage imageNamed:@"searchbarBG"] forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault];
}

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
    return UIBarPositionTopAttached;
}
Run Code Online (Sandbox Code Playgroud)

当我UISearchDisplayController通过在viewDidLoad方法的末尾附加以下行将搜索栏添加到a时出现问题:

self.mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
Run Code Online (Sandbox Code Playgroud)

这是我得到的结果:

在此输入图像描述

请注意,图像看起来有所剪裁.这与我在代码中将UIBarPositionTopAttached更改为UIBarPositionTop时的情况不同:

在此输入图像描述

被剪裁的图像让我想到了clipsToBounds,我可以通过在以下结尾添加这段代码来正确显示搜索栏viewDidLoad:

for (UIView *subview in self.searchBar.subviews) {
    subview.clipsToBounds = NO;
}
Run Code Online (Sandbox Code Playgroud)

所以我猜这UISearchDisplayController是搞乱背景视图的clipsToBounds属性UISearchBar.还有其他人在努力吗?我的代码有问题吗?

更新:

回到2013年10月,除了发布这个问题,我还使用Apple Bug Reporter工具报告了这个问题.2015年1月6日(waaaay为时已晚)我得到了Apple Developer Relations的回复:

没有计划根据以下内容解决此问题:

不再支持UISearchDisplayController.UISearchController应该可以使用所需的功能,如果没有(或者行为不正确),请提交一个新的bug.

我们现在正在结束这份报告.

如果您对解决方案有疑问,或者这对您来说仍然是一个关键问题,请使用该信息更新您的错误报告.

对于可能影响此问题的任何更新,请务必定期检查新的Apple版本.

DZe*_*Bot 3

我遇到了完全相同的问题,但是将 searchBar 的 ClipsToBounds 强制设置为 YES,就成功了。不需要自动布局,也不需要 UIBarPositioning 协议方法。