2011-05-11 1 views
2

J'ai un projet iPad structuré comme: - AppDelegate - mainWindow - Voir contrôleur - VoirFournir un soutien autorotation à un sous-vue chargé par programme - iPad

Les Contrôleurs Afficher le fichier .m charge une autre vue par programme et le positionne sur l'écran. Cette vue va être glissée dedans et dehors.

Je fais ceci:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CGRect viewRect = CGRectMake(0, 0, 0, 0); 
    CalculatorView *v = [[[CalculatorView alloc] 
            initWithFrame:viewRect] autorelease]; 
    [self.view.window addSubview:v]; 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
    v.view.frame = CGRectMake(0, 0, 460, 320); 
    [UIView commitAnimations]; 
} 

La question que j'ai est que la sous-vue j'ajouter ici ne marche pas » semblent avoir la bonne orientation. Le projet prend en charge SEULEMENT paysage, et lance au paysage. La vue du conteneur est très bien, et il contient quelques boutons qui sont bien aussi. Toutefois, cette vue chargée par programme est bloquée en mode Portrait. J'ai fourni le code de rotation automatique suivant (Dans le .m de vue chargée):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

Mais il ne sera jamais appelé. Alors, comment puis-je obtenir la sous-vue ajoutée par programme pour charger en mode paysage et PAS en mode portrait? TIA!

Répondre

1

La classe UIView ne reçoit pas les messages de changement d'orientation.

(spécialement la méthode shouldAutorotateToInterfaceOrientation, qui est une méthode UIViewController)

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW23

Vous devrez ajouter manuellement une méthode vue pour l'informer que l'orientation a changé et vous devrait appeler cette méthode dans votre contrôleur shouldAutorotateToInterfaceOrientation méthode.

Pour ce faire, vous devrez créer une référence à votre vue dans votre contrôleur et prendre soin de la mémoire vous-même.

@interface MyController : UIViewController { 

    CalculatorView *_calculatorView; 

} 

@end 

@implementation MyController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CGRect viewRect = CGRectMake(0, 0, 0, 0); 

    //inits _calculatorView without the autorelease. Will be released in the dealloc method 
    _calculatorView = [[CalculatorView alloc] 
            initWithFrame:viewRect]; 
    [self.view.window addSubview:v]; 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
    _calculatorView.view.frame = CGRectMake(0, 0, 460, 320); 
    [UIView commitAnimations]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    //calls custom interface orientation method 
    [_calculatorView MyInterfaceChangedCustomMethod:interfaceOrientation]; 

    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

-(void) dealloc { 

    [_calculatorView release]; 
    [super dealloc]; 
} 



@end 

EDIT: Si vous CalculatorView est simple et tout ce dont vous avez besoin est de changer son cadre correctement après la rotation de l'appareil, je pense que la meilleure approche serait d'utiliser similaire à la

suivante
_calculatorView = [[CalculatorView alloc] 
            initWithFrame:viewRect]; 
_calculatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
+0

de vous vue autoresizingMask Felipe - Au sujet de l'essayer maintenant, je rapporterai mes résultats. –

+0

Felipe - Ma question est maintenant de savoir à quoi devrait ressembler le "MyInterfaceChangedCustomMethod". –

+0

Qu'en est-il de résoudre cela en en faisant un UIViewController à la place, avec un UIView en tant que variable d'instance? –

Questions connexes