iPhone SDK:设置UISearchDisplayController表视图的大小

时间:2010-03-05 18:06:31

标签: iphone uitableview uisearchdisplaycontroller

我的应用程序的表格视图没有占据整个屏幕的高度,因为我在底部允许横幅为50px。

当我开始在搜索栏中输入内容时,搜索结果表视图会更大;它填充搜索栏和标签栏之间的所有可用屏幕空间。这意味着最后一个搜索结果被横幅遮挡了。

如何指定UISearchDisplayController使用的表视图的大小?我看不到边界或框架属性。

编辑添加屏幕截图:

这是在IB中设置表格视图的方式。它比合成标签栏短50px。

alt text http://iphone.lightwood.net/StackOverflow/gstableviewinib.png

这是内容正常显示的方式。我已经滚到了最底层。 alt text http://iphone.lightwood.net/StackOverflow/gstableviewatbottom.png

这是搜索时显示的方式。我再次滚动到最底层。如果我停用横幅广告,我会看到搜索显示表向下展开到标签栏。

alt text http://iphone.lightwood.net/StackOverflow/gssearchviewatbottom.png

3 个答案:

答案 0 :(得分:51)

解决这个问题的关键是找出何时更改表格视图的几何形状。主叫:

[self.searchDisplayController.searchResultsTableView setFrame:someframe];
创建UISearchDisplayController后,

是徒劳的。答案是这个委托方法:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
    tableView.frame = someframe;
}

注意,我也曾尝试-searchDisplayController:didLoadSearchResultsTableView,但在那里没有任何好处。您必须等到显示它才能调整大小。

另请注意,如果您只是指定tableView.frame = otherTableView.frame,则搜索结果表会与其对应的搜索栏重叠,因此无法清除或取消搜索!

我的最终代码如下:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {

    CGRect f = self.masterTableView.frame;  // The tableView the search replaces
    CGRect s = self.searchDisplayController.searchBar.frame;
    CGRect newFrame = CGRectMake(f.origin.x,
                                 f.origin.y + s.size.height,
                                 f.size.width,
                                 f.size.height - s.size.height);

    tableView.frame = newFrame;
}

答案 1 :(得分:1)

我更新了代码以允许更深层次的视图层次结构,但半透明封面视图的初始帧仍占据搜索栏下方的整个窗口。

-(void)searchDisplayController: (UISearchDisplayController*)controller 
 didShowSearchResultsTableView: (UITableView*)tableView 
{
    if ( [controller.searchBar.superview isKindOfClass: [UITableView class]] )
    {
        UITableView* staticTableView = (UITableView*)controller.searchBar.superview;

        CGRect f = [tableView.superview convertRect: staticTableView.frame fromView: staticTableView.superview];
        CGRect s = controller.searchBar.frame;
        CGRect newFrame = CGRectMake(f.origin.x,
                                     f.origin.y + s.size.height,
                                     f.size.width,
                                     f.size.height - s.size.height);

        tableView.frame = newFrame;
    }
}

答案 2 :(得分:0)

我不确定我是否完全理解你所描述的内容,拥有截图会很棒。

听起来发生的事情是UITableView是屏幕的大小,横幅与底部的50个像素重叠。所有UIView子项都有一个框架,边界和中心属性,它们从它们的常见UIView父级继承。

@interface UIView(UIViewGeometry)

// animatable. do not use frame if view is transformed since it will not correctly reflect the actual location of the view. use bounds + center instead.
@property(nonatomic) CGRect            frame;

// use bounds/center and not frame if non-identity transform. if bounds dimension is odd, center may be have fractional part
@property(nonatomic) CGRect            bounds;      // default bounds is zero origin, frame size. animatable
@property(nonatomic) CGPoint           center;      // center is center of frame. animatable
@property(nonatomic) CGAffineTransform transform;   // default is CGAffineTransformIdentity. animatable
// ... from UIView.h

你可以随意操作这些属性,听起来你只需要将边界调整为比屏幕小50个像素,并做一些数学计算你的新中心。