2010-03-16 2 views
2

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

- (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:, но я получаю то же поведение.

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

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

ответ

3

Прежде всего, ваша функция должна быть немного изменена. Если вы возвращаете объект, который был alloc 'd, но не autorelease' d, то ваше имя метода должно указывать на это (то есть 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, в случае, если вы не знаете, вы можете построить поисковые экраны довольно легко с новым UISearchDisplayController класса Apple, введенной в iPhone OS 3 .Икс. Мог бы спасти вас, изобретая колесо, здесь.

+0

Я должен был указать, что blackOverlay на самом деле является ленивым загружаемым свойством только для чтения, поэтому объект фактически управляет своей памятью. Спасибо, что обратились ко мне в UISearchDisplayController. Я не знал о его существовании, и действительно кажется, что я изобретаю колесо! – hadronzoo

+1

FYI, UISearchDisplayController также рисует непосредственно в tableView, если задан TableViewController как его contentController. – hadronzoo

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

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

Смежные вопросы