2010-03-16 4 views
2

J'ai un UITableView dont les données ont des sections. J'afficher une vue en superposition sur le dessus de tableView qui obscurcit quand la recherche:En-têtes de section UITableView dessin au-dessus de la sous-vue avant

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

Cela fonctionne parfaitement aussi longtemps que tableView ne contient pas de sections. Lorsque tableView contient des sections et les mises à jour de tableView (par exemple, lorsque la vue réapparaît après avoir ouvert une vue hors de la pile du contrôleur de navigation), les en-têtes de section sont rendus au-dessus de blackOverlay. Cela laisse tableView estompé sauf pour les en-têtes de section. J'ai essayé d'appeler [tableView bringSubviewToFront:self.blackOverlay] depuis viewWillAppear:, mais j'ai le même comportement. Ma méthode de travail actuelle retourne zéro pour les en-têtes de section tableView alors que la superposition est présente, mais cela laisse des espaces blancs dans la vue tabulée superposée où les en-têtes de section étaient précédemment.

Comment puis-je m'assurer que les en-têtes de section tableView ne sont jamais dessinés au-dessus de blackOverlay? Ou, est-il possible de créer une vue devant tableView à partir d'une sous-classe UITableViewController qui n'est pas une sous-vue de tableView?

Répondre

3

Tout d'abord, votre fonction devrait être légèrement modifiée. Si vous renvoyez un objet qui était alloc 'd mais pas autorelease' d, alors le nom de votre méthode doit indiquer que (c'est-à-dire newBlackOverlay). Deuxièmement, votre méthode modifie un objet tableView qui ne lui a pas été donné, de sorte que ses interactions avec d'autres composants ne sont pas évidentes (voir Law of Demeter).

Le problème est que vous mettez cette incrustation noire en tant qu'enfant de la vue de table. Vous devriez le mettre au même niveau de la vue du tableau, i.e. .:

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

Vous pouvez créer à l'intérieur Interface Builder et définissez les propriétés backgroundColor/alpha comme bon vous semble. Créez un nouveau UIView@property dans votre contrôleur de vue et réglez-le sur votre nouveau UIView. Vous pouvez ensuite modifier la valeur alpha de la superposition et/ou la masquer complètement dans vos fonctions de rappel lorsque l'utilisateur démarre/termine la recherche de tâches.

J'ai un UITableView dont les données ont sections. J'affiche une vue de superposition sur haut de tableView qui obscurcit quand recherche

FWIW, au cas où vous ne savez pas, vous pouvez construire des écrans de recherche assez facilement avec la nouvelle pomme classe UISearchDisplayController introduit dans l'iPhone OS 3 .X. Cela pourrait vous éviter de réinventer la roue, ici.

+0

J'aurais dû préciser que blackOverlay est en fait une propriété en lecture seule chargée paresseusement, donc l'objet gère réellement sa mémoire. Merci de m'avoir référé à UISearchDisplayController. Je n'étais pas au courant de son existence et en effet il semble que je réinvente la roue! – hadronzoo

+1

FYI, le UISearchDisplayController dessine directement sur la tableView aussi si un TableViewController est donné comme contenuController. – hadronzoo

0

Je résolu ce problème en créant un contrôleur de vue racine et faire ma table afficher une sous-vue de ce contrôleur:

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

j'étais alors en mesure d'utiliser un UISearchDisplayController avec une barre de recherche en haut de la tableView sans problème.

Questions connexes