UITableView节标题在前面的子视图上方绘制

时间:2010-03-16 19:59:53

标签: iphone uiview uitableview

我有一个UITableView,其数据有部分。我在tableView上显示一个覆盖视图,在搜索时使其变暗:

- (UIView *)blackOverlay {
    if (!blackOverlay) {
        blackOverlay = [[UIView alloc] initWithFrame:[self overlayFrame]];
        blackOverlay.alpha = 0.75;
        blackOverlay.backgroundColor = UIColor.blackColor;
        [tableView insertSubview:blackOverlay aboveSubview:self.parentViewController.view];
    }
    return blackOverlay;
}

只要tableView不包含节,这就完美无缺。当tableView确实包含部分和tableView更新时(例如,在从导航控制器堆栈弹出视图后再次出现视图时),部分标题将呈现在blackOverlay上方。除了节标题之外,这会使tableView变暗。我尝试在[tableView bringSubviewToFront:self.blackOverlay]内调用viewWillAppear:,但我也有同样的行为。

当叠加层存在时,我当前的解决方法是返回nil for tableView节标题,但这会在重叠的tableView中留下空格间隙,其中节标题是之前的。

我怎样才能确保tableView节标题永远不会在blackOverlay上面绘制?或者,是否可以在不是tableView的子视图的UITableViewController子类中创建tableView前面的视图?

2 个答案:

答案 0 :(得分:3)

首先,你的功能应该稍微调整一下。如果您要返回alloc但不是autorelease'的对象,那么您的方法名称应该表明(即newBlackOverlay)。其次,您的方法正在修改未赋予它的tableView对象,因此它与其他组件的交互不明显(参见Law of Demeter)。

问题在于您将此黑色叠加层设置为表格视图的子项。您应该将它插入表视图的同一级别,即:

UIView (set to the view controller's view)
|
+-UITableView
|
+-UIView (your new black overlay)

您可以在Interface Builder中创建它,并根据需要设置backgroundColor / alpha属性。在视图控制器中创建一个新的UIView @property,并将其设置为新的UIView。然后,您可以更改叠加层的alpha值和/或在用户开始/结束搜索任务时在回调函数中完全隐藏它。

  

我有一个UITableView,其数据有   部分。我在上面显示叠加视图   tableView的顶部,当它变暗时   搜索

FWIW,如果您不知道,您可以使用iPhone OS 3.x中引入的新UISearchDisplayController类Apple轻松构建搜索屏幕。这可能会让你重新发明轮子。

答案 1 :(得分:0)

我通过创建一个根视图控制器并使我的表视图成为该控制器的子视图来解决这个问题:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Create the root view to hold the table view and an overlay
    UIView *root = [[UIView alloc] initWithFrame:self.navigationController.view.frame];
    root.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    root.autoresizesSubviews = YES;
    self.view = root;

    // Setup the table view
    UITableView *newTableView = [[UITableView alloc] initWithFrame:self.navigationController.view.frame style:UITableViewStylePlain];
    newTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.tableView = newTableView;
    [newTableView release];
    [root addSubview:self.tableView];

    [root release];
}

然后我可以在tableView顶部使用UISearchDisplayController搜索栏而不会出现问题。