2010-09-29 8 views
0

J'ai un couple de contrôleurs de vue que je veux tous partager une barre d'état d'en-tête. Cette vue d'en-tête montre le statut de certaines choses dans mon application. J'ai utilisé IB pour mettre en page le contenu de la vue d'en-tête dans son propre xib, puis j'ai utilisé IB pour mettre en page les contrôleurs de vue, en ajoutant un élément UIView de placeholder dans les xibs du contrôleur de vue lorsque je le charge dans l'en-tête. Maintenant, quand je crée une sous-classe UIView à partir du contenu de la vue xib, et l'ajouter comme sous-vue à l'un de mes contrôleurs de vue, l'emplacement que j'ai spécifié pour la vue d'en-tête dans mon contrôleur xib semble être ignoré, et la vue d'en-tête est placée à (0,0) quoi qu'il arrive. Tout le contenu de l'affichage de l'en-tête se charge et apparaît bien, c'est juste l'emplacement de la vue d'en-tête dans le contrôleur de vue qui est faux.L'emplacement spécifié par xib se déplace sur la charge UIView?

Voilà comment je charge et en ajoutant mon point de vue d'en-tête à mon contrôleur de vue:

header = [InfoHeader loadFromNib:MY_NIB_NAME withOwner:self]; 
[self.view addSubview:header]; 

Le contrôleur est vue xib confirmé avoir une sortie reliée à la variable 'en-tête. Et voici la méthode 'loadFromNib':

+(InfoHeader *) loadFromNib: (NSString *) nibName withOwner:(id) objectOwner 
{ 
    NSBundle *b = [NSBundle mainBundle]; 
    NSArray *nib = [b loadNibNamed:nibName owner:objectOwner options:nil]; 

    InfoHeader *header; 

    for (id obj in nib) 
    { 
     if ([obj isKindOfClass:[InfoHeader class]]) 
     { 
      header = (InfoHeader *) obj; 
     } 
    } 

    return header; 
} 

Des idées sur quoi vérifier ici? Je préfère ne pas localiser la barre d'en-tête par programme, mais laissez IB le faire.

Répondre

1

Avez-vous changé l'emplacement de votre sous-vue dans IB? Habituellement, l'emplacement par défaut (0, 0) de la vue sera la coordonnée (en haut à gauche) de la grande vue de l'écran. Je pense que la vérification qui fonctionnera bien

+0

Oui, mon sous-vue est de 44 pixels vers le bas de la en haut dans IB. Mais, peu importe où je place l'UIView dans IB, la vue affichée apparaît à (0,0). –

+0

Attendez, votre vue d'en-tête est juste une vue à droite, comment pouvez-vous mettre 44 pixels en haut IB? Je n'obtiens pas votre mise en page dans IB pour être honnête. – vodkhang

+0

Oui, ma vue d'en-tête est juste une vue dans la vue principale de mon contrôleur. Le contrôleur de vue a l'affichage en mode plein écran, puis j'ai placé une vue plus petite (pour mon en-tête) dans cette vue. Partout où je place cet objet UIView dans IB (haut, bas, n'importe où), il apparaît en haut quand je le lance. –

0

Vous pouvez le faire sans utiliser une vue « espace réservé » du tout, en spécifiant par programmation le cadre de la sous-vue:

InfoHeader *header = [InfoHeader loadFromNib:MY_NIB_NAME withOwner:self]; 
header.frame = CGRectMake(0, 44, header.frame.size.width, header.frame.size.height); 
[self.view addSubview:header]; 

(que asssumes de code que vous avez supprimé la header sortie de votre classe, donc ce peut être une variable locale à la place).

Ou, si vous préférez utiliser l'espace réservé (vous pouvez spécifier à l'aide IB au lieu de programmation de la position de l'en-tête), le faire comme ceci:

InfoHeader *headerView = [InfoHeader loadFromNib:MY_NIB_NAME withOwner:self]; 
[header addSubview:headerView]; 
Questions connexes