为什么UISearchBar及其范围按钮显示在一行中?

时间:2010-08-10 08:59:56

标签: ipad uisearchbar uisearchdisplaycontroller

我看过Apple的示例“TableSearch”,触摸其范围按钮时会出现在搜索栏下方。 http://developer.apple.com/iphone/library/samplecode/TableSearch/Introduction/Intro.html

但是当我自己制作它起初看起来很好但是当我触摸它看起来像丑陋时,范围按钮和搜索栏显示在同一行中,如下所示: http://cl.ly/BN9

我该怎么做才能使它像iPad中的“TableSearch”示例一样?

我正在做IB中的所有事情并尝试从控制器以编程方式修改搜索栏:

    - (void)viewDidLoad {

        [super viewDidLoad];
        self.tableView.rowHeight = 88.0f;
        self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);
self.searchDisplayController.searchResultsTableView.rowHeight = self.tableView.rowHeight;


    //BELOW DID NOT WORK:
    CGRect b = self.searchDisplayController.searchBar.bounds;
    self.searchDisplayController.searchBar.bounds = CGRectMake(b.origin.x, b.origin.y, b.size.width, self.tableView.rowHeight);
    b = self.searchDisplayController.searchBar.frame;
    self.searchDisplayController.searchBar.frame = CGRectMake(b.origin.x, b.origin.y, b.size.width, self.tableView.rowHeight);

    //BELOW WORKS PERFECT BUT IS A PRIVATE METHOD, HENCE I AM NOT SUPPOSED TO USE IT
    //[self.searchDisplayController.searchBar setCombinesLandscapeBars:NO];

     }

提前致谢。

4 个答案:

答案 0 :(得分:10)

我也遇到过这个错误,我已经向Apple提交了一份报告,并要求提供技术帮助。我会告诉你它是怎么回事。与此同时,我将简要介绍一下这个bug。

在iPhone上,为了在横向模式下保留珍贵的垂直屏幕空间,UISearchDisplayController将UISearchBar设置为在单个水平布局中组合其搜索栏和搜索字段。这很好用,因为屏幕的水平尺寸增加(横向480点)。不幸的是,它在iPad上工作得不是很好,在横向模式下,首先不需要改变UI因为你有足够的垂直空间。在UISplitViewController的主视图中,您仍然只有320像素的水平显示空间,而不是增加的480的iPhone。结果是iSore。

据推测,问题在于UISearchDisplayController在其willRotateToInterfaceOrientation:duration:方法中表现不佳。具体来说,在它的UISearchBar上设置combineLandscapeBars属性之前,无需检查它是否在iPhone上。代码中的私有API kludge起作用,因为它修复了UISearchDisplayController中的疏忽。但是,当然苹果公司会因为使用未记录的API而使古人对你的愤怒降下来,所以你做不到。真的,我们受苹果公司的支配。

如果您愿意放弃UISearchDisplayController的眼睛和便利,您可以使用UISearchBar没有UISearchDisplayController并自己管理演示的各个方面。显然,这需要更多的代码,如果Apple的API工程师完成他们的工作将毫无意义,但它至少会解决显示错误。

如果你是Apple,你可以使用你自己的未记录的API,这就是Mail.app没有这个问题的原因。

更新

我向Apple提交的错误报告是#8344719。

答案 1 :(得分:1)

使用以下代码,您将不会收到警告:

if ([self.searchDisplayController.searchBar respondsToSelector:@selector(setCombinesLandscapeBars:)])
{
    objc_msgSend(self.searchDisplayController.searchBar, @selector(setCombinesLandscapeBars:), NO );
}

答案 2 :(得分:0)

当你为searchBar设置边界和框架时,就像这里的框架一样:

blabla.searchBar.frame = CGRectMake(b.origin.x, 
                                    b.origin.y, 
                                    b.size.width, 
                                    self.tableView.rowHeight);
似乎高度存在问题。范围按钮在搜索栏下方需要一些空间,因此您应该增加边界和框架的高度。

如果您在某些事件上显示和隐藏范围按钮,则每次都需要调整帧大小。

答案 3 :(得分:0)

我在iPad上遇到了这个问题,但是如果我将其插入我的实现文件中,我可以使用它:

@synthesize tableView;

我猜测XIB被加载有什么不好,但我不知道为什么会这样做。