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

我想让我的search栏在状态栏的下方向上延伸,如下所示:

在这里输入图像说明

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

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

当我将search栏添加到UISearchDisplayController通过在viewDidLoad方法的末尾添加以下行来产生问题

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

这是我得到的结果:

在这里输入图像说明

请注意,图像看起来剪辑。 这与我在代码中将UIBarPositionTopAttached更改为UIBarPositionTop时的外观不同:

在这里输入图像说明

正在剪辑的图像让我想到了clipsToBounds ,我可以通过在viewDidLoad的末尾添加这段代码来正确显示search栏:

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

所以我猜UISearchDisplayController搞乱了UISearchBar背景视图的clipsToBounds属性。 有没有人与此挣扎? 我的代码有问题吗?

更新:

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

目前没有计划根据以下内容来解决这个问题:

UISearchDisplayController不再受支持。 UISearchController所需的function应该是可用的,如果不是(或行为不正确),请提交一个新的错误。

我们现在正在closures这个报告。

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

请务必定期检查新的Apple版本是否有任何可能影响此问题的更新。

我有完全相同的问题,但迫使clipToBounds为YES的search条,做了伎俩。 不需要自动布局,也不需要UIBarPositioning协议方法。

您符合UIBarPositioningDelegate协议,正确成为您的SearchBar的委托,执行UIBarPositioningDelegate方法

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