Рисование заголовков секций UITableView над передним подвидом - PullRequest
2 голосов
/ 16 марта 2010

У меня есть 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 для заголовков разделов tableView, пока присутствует наложение, но это оставляет пробелы в пробелах наложенного tableView, где ранее были заголовки разделов.

Как сделать так, чтобы заголовки разделов tableView никогда не отображались выше blackOverlay? Или, возможно ли создать представление перед tableView из подкласса UITableViewController, который не является подвидом tableView?

Ответы [ 2 ]

3 голосов
/ 17 марта 2010

Прежде всего, ваша функция должна быть немного подправлена. Если вы возвращаете объект, который был alloc 'd, но не autorelease' d, то имя вашего метода должно указывать это (т.е. newBlackOverlay). Во-вторых, ваш метод изменяет объект tableView, который ему не был предоставлен, поэтому его взаимодействие с другими компонентами не очевидно (см. Закон Деметры ).

Проблема в том, что вы помещаете этот черный оверлей как дочерний элемент табличного представления. Вы должны вставить его на том же уровне представления таблицы, т. Е .:

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

Вы можете создать его в Интерфейсном Разработчике и установить свойства backgroundColor / alpha по своему усмотрению. Создайте новый UIView @property в вашем контроллере представления и установите для него новый UIView. Затем вы можете изменить значение alpha наложения и / или полностью скрыть его в функциях обратного вызова, когда пользователь начинает / заканчивает поиск задач.

У меня есть UITableView, данные которого имеют разделы. Я отображаю наложение на верхняя часть tableView, которая затемняет его, когда поиск

FWIW, если вы не знаете, вы можете довольно легко создавать экраны поиска с новым классом Apple UISearchDisplayController, представленным в iPhone OS 3.x. Можете спасти вас, заново изобретая колесо, здесь.

0 голосов
/ 11 мая 2010

Я решил эту проблему, создав контроллер корневого представления и сделав мой табличный просмотр подпредставлением этого контроллера:

- (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];
}

Тогда я смог без проблем использовать UISearchDisplayController с панелью поиска в верхней части таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...