我的应用程序的表格视图没有占据整个屏幕的高度,因为我在底部允许横幅为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
答案 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个像素,并做一些数学计算你的新中心。