当将UISearchBar添加到UISearchDisplayController时,UISearchBar会被剪裁在状态栏下方。

11

我希望我的搜索栏能够像这样在状态栏下方向上延伸背景:

enter image description here

这是上面图片对应的代码:

- (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;
}

当我将搜索栏添加到UISearchDisplayController时,问题就出现了,这是通过在viewDidLoad方法的末尾添加以下行来完成的:

self.mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];

这是我得到的结果:

enter image description here

请注意,图像被裁剪了。 这与在代码中将UIBarPositionTopAttached更改为UIBarPositionTop所看到的不同:

enter image description here

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

for (UIView *subview in self.searchBar.subviews) {
    subview.clipsToBounds = NO;
}

所以我想猜测UISearchDisplayController正在干扰UISearchBar背景视图的clipsToBounds属性。还有其他人遇到这个问题吗?我的代码有问题吗?

更新:

除了发布这个问题外,我还在2013年10月使用了苹果的Bug Reporter工具进行了报告。在2015年1月6日(太晚了)我收到了来自苹果开发者关系的答复:

根据以下原因,我们没有计划解决这个问题:

UISearchDisplayController已不再受支持。所需的功能应该在UISearchController中可用,如果没有(或行为不正确),请提交新的错误。

我们现在正在关闭此报告。

如果您对解决方案有疑问,或者这仍然是您的重大问题,请更新您的错误报告。

请务必定期检查新的Apple发布以获取可能影响此问题的任何更新。


1
这非常有帮助,谢谢!在我的情况下,涉及到一个UITableViewController,并添加self.tableView.clipToBounds = NO解决了它(虽然我不确定这样做是否对性能有好处,所以只在搜索栏被激活时才这样做)。 - Clafou
2个回答

3

我曾经遇到过完全相同的问题,但是将searchBar的clipsToBounds强制设置为YES就解决了问题。不需要自动布局或UIBarPositioning协议方法。


0

您需要遵循 UIBarPositioningDelegate 协议,并在正确成为 SearchBar 的代理后,按照以下方式实现代理方法:

-(UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }


我的错误。我已经在iOS 7中使用了在故事板中带有20pt偏移的条形图。我以为它也适用于你的条形图。顺便问一下,你的搜索栏的代理被调用了吗? - Matt
是的,确实是这样。问题只会在我将搜索栏添加到 UISearchDisplayController 时出现。 - albertamg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接