2010-07-16 4 views
1

Je ne le fais probablement pas correctement. N'ayant pas fait une application iPad avant de faire ce qui me semble naturel.UIView n'est pas positionné avec setFrame

J'ai un UIView qui va être composé d'autres UIViews. Plus précisément, je souhaite créer et ajouter des sous-vues de manière dynamique à chacune de ces sous-vues. En d'autres termes:

UIView 
    | 
    | --> UIView 
      | 
      | --> Dynamic UIView 1 
      | --> Dynamic UIView 2 
      | --> ... 

j'ai réussi à 'Dynamic UIView 1' en ajoutant à son initWithFrame ce morceau de code pour charger le: xib

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"ItemView" 
                owner:[[ItemViewController alloc] init] 
               options:nil]; 
ItemView *infoView = [nibViews objectAtIndex:0]; 
[self addSubview:infoView]; 

Il fonctionne! Le problème que j'ai est que «Dynamic UIView n» est toujours rendu dans le coin supérieur gauche de l'écran. Si j'essaie de changer la position avec setFrame, je reçois une boîte noire pour représenter le cadre, mais le contenu du contrôle reste en haut à gauche.

Des idées? Y a-t-il une meilleure manière de faire cela?

Mise à jour ----- -----

Voici une capture d'écran de la vue racine. Overview of main UIView http://www.freeimagehosting.net/uploads/460090996d.png

Le contrôle entier est appelé CurrentItemsViewController. La zone verte est un UIView dans lequel je me suis lié dans le code via un lien dans le IB, dans l'exemple de code, il est appelé "itemsUIView". Voici comment je suis d'ajouter des articles dans CurrentItemsViewController.m

- (id)init { 
[super initWithNibName:nil 
       bundle:nil]; 

UITabBarItem *tbi = [self tabBarItem]; 
[tbi setTitle:@"Current"]; 

/* Approach 1 */ 
NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"ItemView" 
                owner:[[ItemViewController alloc] init] 
               options:nil]; 
ItemView *subItemView1 = [nibViews objectAtIndex:0]; 

/* Approach 2 - this apprach does Approach 1 in the initWithFrame method */ 
//ItemView *subItemView1 = [[ItemView alloc] initWithFrame:CGRectMake(120, 120, 354, 229)]; 

/* Approach 3 */ 
//ItemViewController *ctr = [[ItemViewController alloc] init]; 
//UIView *subItemView1 = [ctr view]; 

[[self view] addSubview:subItemView1]; 
// [[self itemsUIView] addSubview:subItemView1]; <-- doesn't render subItemView1 at all 
[subItemView1 release]; 

[subItemView1 setFrame:CGRectMake(120, 120, 354, 229)]; 
[subItemView1 setBounds:CGRectMake(120, 120, 354, 229)]; 

return self; 
} 

A l'intérieur de ItemView.m je cela, il ne GARDERA par l'approche 2 et 3.

- (id)initWithFrame:(CGRect)frame { 
if ((self = [super initWithFrame:frame])) { 

    NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"ItemView" 
                 owner:[[ItemViewController alloc] init] 
                options:nil]; 
    ItemView *infoView = [nibViews objectAtIndex:0]; 
    [self addSubview:infoView]; 

} 
return self; 
} 

Comme le montre, j'ai essayé de créer l'ItemView 3 façons différentes et chacun rend le même résultat. Lorsque j'ajoute la vue en tant que sous-vue de la vue racine, j'obtiens ceci. Notez qu'un carré apparaît à l'endroit où il doit s'afficher, mais ViewItem s'affiche en réalité dans le coin supérieur gauche. Dans l'exemple ci-dessus, lorsque j'ajoute subItemView1, il ne restitue rien du tout.

alt text http://www.freeimagehosting.net/uploads/c6635ce860.png

+1

S'il vous plaît fournir quelques détails: captures d'écran, tout le code de '' initWithFrame: le code 'setFrame' ... –

+0

Let Je sais si tu en veux plus. – Steven

Répondre

1

Essayez le réglage du cadre avant de l'ajouter en tant que sous-vue.

Votre code:

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"ItemView" 
               owner:[[ItemViewController alloc] init] 
              options:nil]; 
ItemView *infoView = [nibViews objectAtIndex:0]; 
self addSubview:infoView]; 

devrait être:

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"ItemView" 
               owner:[[ItemViewController alloc] init] 
              options:nil]; 
ItemView *infoView = [nibViews objectAtIndex:0]; 
infoView.frame = CGRectMake(put your rect here); 
[self addSubview:infoView]; 
Questions connexes