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

时间:2013-10-02 16:24:43

标签: ios ios7 uisearchbar uisearchdisplaycontroller

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

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正在弄乱clipsToBounds背景视图的UISearchBar属性。还有其他人在努力吗?我的代码有问题吗?

更新

早在2013年10月,除了发布此问题之外,我还使用Apple Bug Reporter工具进行了报告。 2015年1月6日(waaaay为时已晚)我得到了Apple Developer Relations的回复:

  

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

     

不再支持UISearchDisplayController。所需   功能应该可以使用UISearchController,如果没有   (或表现不正确),请提交新的错误。

     

我们现在关闭此报告。

     

如果您对分辨率有疑问,或者这仍然是一个问题   关键问题,请用此更新您的错误报告   信息。

     

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

2 个答案:

答案 0 :(得分:3)

我遇到了完全相同的问题,但是对于searchBar强制使用clipsToBounds为YES,就可以了。无需自动布局或UIBarPositioning协议方法。

答案 1 :(得分:0)

您遵守UIBarPositioningDelegate协议,并在正确成为SearchBar的委托后,实现委托方法

  

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