2010-08-27 4 views
1

Okay donc j'ai une application très basique avec une vue en un seul bouton. J'ai le contrôleur réglé pour autoriser seulement le paysage. Mon problème est qu'après qu'il est initialisé, puis je clique sur mon bouton (qui a seulement une déclaration de journal), est différent des déclarations de journal que j'ai à la fin de mon init.iPad cadre uiview change juste après initWithFrame

Je démarre l'application en mode paysage sur mon simulateur (même résultat sur l'appareil). C'est comme si je l'ai assigné, il revient juste en arrière. J'ai essayé cette déclaration self.frame = CGRectMake(0, 0, 1024, 768); dans ma méthode buttonClicked, mais cela juste déformé et déplacé.

- (id)initWithFrame:(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])) 
    { 
    //BUTTONS 
    attributesButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    attributesButton.frame = CGRectMake(self.frame.size.width - buttonPadding - 35, self.frame.size.height/2 -22 -150, 35, 35); 
    [attributesButton setBackgroundImage:[UIImage imageNamed:@"loadIcon.png"] forState:UIControlStateNormal]; 
    [attributesButton addTarget:self action:@selector(attributesButtonClicked) 
       forControlEvents:UIControlEventTouchUpInside]; 
    [attributesButton setTitle:@"Attr" forState:UIControlStateNormal]; 
    [self addSubview:attributesButton]; 
    NSLog(@"Width: %f",self.frame.size.width); 
    NSLog(@"Height: %f",self.frame.size.height); 
    } 
    return self; 
} 

-(void)attributesButtonClicked 
{ 
    NSLog(@"Width: %f",self.frame.size.width); 
    NSLog(@"Height: %f",self.frame.size.height); 
} 

Donc c'est mon init. Désolé, il semble si terrible je ne sais pas pourquoi. Mon contrôleur de vue:

- (void)loadView 
{ 
    NSLog(@"myViewController: loadView"); 

    myView = [[myView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]; 

    self.view = myView; 

} 

Maintenant, c'est la partie qui me donne, les déclarations de journal.

2010-08-27 15:16:55.242 tester[8703:40b] myViewController: loadView 
2010-08-27 15:16:55.262 tester[8703:40b] Width: 1024.000000 
2010-08-27 15:16:55.262 tester[8703:40b] Height: 768.000000 
CLICK MY BUTTON HERE 
2010-08-27 15:17:05.689 tester[8703:40b] Width: 748.000000 
2010-08-27 15:17:05.689 tester[8703:40b] Height: 1024.000000 

Répondre

0

Si votre vue est lié à l'un des contrôleurs de vue standards (UINavigationController, UITabBarController, ...), le contrôleur mettra à jour la taille du cadre lors de l'exécution, peu importe ce que vous spécifiez dans initWithFrame.

C'est en fait une bonne chose, parce que vous n'avez pas à vous soucier de l'orientation, barres d'outils prennent de la place, etc.

+0

Ma vue n'est pas liée à et des contrôleurs standard. Just: @interface myViewController: UIViewController –

+0

Il n'est pas nécessaire de lier directement un contrôleur de vue standard. Votre "myViewController" est probablement utilisé dans un UINavigationController ou UITabBarController. Cela vous donnera le même comportement –

0

qui est probablement parce que la vue est autoresized par la vue parent lorsque vous l'ajoutez comme sous-vue Si vous ne voulez pas que cela se produise (bien que vous auriez habituellement faites pour une vue plein écran) vous pouvez définir le autoresizingMask-UIViewAutoresizingNone:

- (id)initWithFrame:(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])) 
    { 
     ... 
     self.autoresizingMask = UIViewAutoresizingNone; 
    } 
    return self; 
} 

EDIT: ok, désolé, je viens de me rappeler que UIViewAutoresizingNone est en fait La valeur par défaut pour autoresizingMask, donc le réglage de cette valeur lors de l'initialisation ne changera rien. Mais le point est que le cadre est modifié par la vue de dessus lorsque vous ajoutez votre vue en tant que sous-vue.

+0

Cela n'a pas aidé. Merci pour la pensée cependant. Pourquoi le redimensionner pour le portrait si je suis en paysage? –

+0

Je n'ai pas ajouté de sous-vue, je viens de définir self.view à myView. quand j'ai essayé d'ajouter Subview je n'obtiens rien (parce que ma vue est nulle) –

+0

oui, mais un autre objet (le délégué de l'application, peut-être?) va prendre cette vue et l'ajouter comme une sous-vue à une autre vue (éventuellement la principale fenêtre d'application), sinon vous ne seriez pas capable de le voir du tout, non? C'est quand le cadre est changé. – filipe

1

D'après ce que j'ai connu, il semble que même si vous êtes en mode paysage, si vous utilisez des masques de redimensionnement automatique, vous devez utiliser un cadre « portrait » lors de l'initialisation de votre vue à l'aide initWithFrame:

Essayez:

myView = [[myView alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)]; 
Questions connexes