Adapter l'écran quand on le fait tourner (affichage et coordonnées)

MinishlinkMinishlink Membre
12:26 modifié dans API UIKit #1
Bonjour tout le monde ! :)

Je suis nouveau dans le monde du dev' iTouch et je me demande comment adapter l'écran quand on le fait tourner.

Je m'explique. Je voudrais faire en sorte que lorsque l'application se lance, un message apparait (juste un background) qui demande au joueur de tourner l'écran horizontalement afin de pouvoir jouer.

Je ne trouve pas la solution et j'ai un aussi un doute : est-ce que les coordonnées x,y de l'écran vont bien changer en fonction de l'orientation ? Si non, comment le faire manuellement ?

Merci :)

Réponses

  • AliGatorAliGator Membre, Modérateur
    12:26 modifié #2
    Salut Minishlink et bienvenue sur OC ;)

    Pour faire ce que tu veux c'est simple, il suffit de prévoir une sous-classe de ViewController et de l'utiliser dans ton application. Dans ta sous-classe il suffit de surcharger alors :
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />&nbsp; return UIDeviceOrientationIsLandscape(interfaceOrientation);<br />}
    
    En effet, cette méthode est appelée pour savoir si tu as "le droit" de faire tourner l'interface de ton appli, quand tu tournes ton iPhone ou iPod Touch, ça appelle cette méthode pour vérifier si ça va tourner automatiquement l'interface... ou pas.

    La doc ici

    Après, dans IB, tu peux cliquer dans la barre de titre de la fenêtre dot tu veux créer l'interface (ta NSWindow) : à  droite de la barre de titre y'a une petite flèche et si tu cliques dessus ça va tourner la fenêtre pour te permet de faire le design de ton interface horizontale directement :)

    D'ailleurs tu peux aussi imposer l'orientation de ton interface au lancement aussi, pour que ça tourne ton interface directement au lancement. Comme ça quand l'utilisateur va lancer ton appli, ton interface va tourner directement sans te demander ton avis :) donc l'utilisateur va évidemment tourner son iPhone/iPod Touch pour utiliser ton appli. C'est comme ça que font toutes les applis prévues pour ne fonctionner qu'en mode paysage d'ailleurs, à  ma connaissance :D
  • LastikoLastiko Membre
    janvier 2009 modifié #3
    bonsoir

    tu peux lorsque ton appli se lance forcer le mode paysage
    par exemple ceci
    <br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />	//return YES ; //for supported orientations<br /> &nbsp; &nbsp;return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);<br />}
    


    de plus de mémoire faut le modifier aussi dans ton .plist  et ca ira toujours en mode landscape meme si tu le retourne ca ne changera rien
  • MinishlinkMinishlink Membre
    12:26 modifié #4
    Et bien merci à  vous deux :)

    J'ai donc mis ça dans ma classe ApplicationDidFinishedLaunching ou un truc comme ça :
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight; //comme ça on demande pas son avis mais l&#39;utilisateur tourne son appareil<br />application.idleTimerDisabled = YES; // totalement autre chose
    


    L'iPod est bien tourné vers la droite direct quand je lance le simulateur, mais quand je regarde les coordonnées X et Y se sont les mêmes que quand il est droit ! :o

    N'y a-t-il pas un moyen d'adapter les coordonnées ?

    Merci encore ! :) (faudrait changer ce smiley qui donne l'air c*n ;) d'ailleurs les smileys du forum sont trop dans l'extrême de ce qu'ils doivent exprimer...)
  • LastikoLastiko Membre
    12:26 modifié #5
    tu veux faire quoi exactement car avec
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />	//return YES ; //for supported orientations<br />&nbsp; &nbsp; return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);<br />}
    


    et la modif du.plist ca suffit largement enfin tout dépend de tes besoins  :(renaud): celui la est mieux
  • MinishlinkMinishlink Membre
    12:26 modifié #6
    Je modifie quoi dans le .plist ?


    (Ce que je veux exactement maintenant c'est que le coin haut/gauche quand on a tourné l'écran soit aux coordonnées 0, 0)
  • LastikoLastiko Membre
    janvier 2009 modifié #7
    2 secondes je regarde

    tu mets  UIInterfaceOrientation
    et tu lui donne la valeur UIInterfaceOrientationLandscapeRight  ( par exemple  :brule: )
  • MinishlinkMinishlink Membre
    12:26 modifié #8
    Ben ça ça fait exactement ce que fait :
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;

    Et j'ai aussi le shouldautorotate.

    Ca ne mets pas le coin haut/gauche aux coordonnées 0, 0...
  • LastikoLastiko Membre
    12:26 modifié #9
    ah :O
  • MinishlinkMinishlink Membre
    12:26 modifié #10
    Il faut peut-être mettre à  jour la matrice de projection OpenGL ?
  • LastikoLastiko Membre
    12:26 modifié #11
    je sais pas si ca va t'aider mais dans interface builder tu peux spécifier la valeur de tes coins
    par exemple en haut a gauche valeur x O et y O
    par défaut c'est au centre
  • MinishlinkMinishlink Membre
    12:26 modifié #12
    C'était une bonne idée mais ça même changer les X et Y dans IB de Window et glView ça ne change pas :(

    Je vais sans doute devoir faire sans :(
  • LastikoLastiko Membre
    12:26 modifié #13
    grrrrrrrrr désolé :(
  • Philippe49Philippe49 Membre
    12:26 modifié #14
    dans 1233342855:

    Ca ne mets pas le coin haut/gauche aux coordonnées 0, 0...

    Il faut prendre les coordonnées relativement à  la vue :
    location=[aTouch locationInView:self.view];
    NSLog(@in view : (%.2f,%.2f),location.x,location.y);

    Autrement tu as la property transform qui permet de changer le context graphique.
  • LastikoLastiko Membre
    12:26 modifié #15
    merci philou je pensais
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #16
    Comme exemple pour saisir et traiter les coordonnées dans un environnement OpenGL ES, Apple fournit l'exemple GLPaint.

    remarque : Dans cet exemple, location=[aTouch locationInView:self.view]; est remplacé par location=[aTouch locationInView:self]; car c'est l'UIView qui répond à  l'événement, et non l'UIViewController.
    De plus, ils ont ajusté la lecture par location.y = bounds.size.height - location.y;



  • Eddy58Eddy58 Membre
    12:26 modifié #17
    Il faut appliquer la transformation au chargement de ta vue.

    Implémentation du ViewController :

    [tt]
    #import "ViewController.h"

    @implementation ViewController

    -(void)dealloc
    {
        [super dealloc];
    }

    -(void)viewDidLoad
    {
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

    [super viewDidLoad];

    if (orientation == UIInterfaceOrientationLandscapeRight)
    {
    CGAffineTransform transform = self.view.transform;

    // Use the status bar frame to determine the center point of the window's content area.
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
    CGRect bounds = CGRectMake(0, 0, statusBarFrame.size.height, statusBarFrame.origin.x);
    CGPoint center = CGPointMake(bounds.size.height / 2.0, bounds.size.width / 2.0);

    // Set the center point of the view to the center point of the window's content area.
    self.view.center = center;

    // Rotate the view 90 degrees around its new center point.
    transform = CGAffineTransformRotate(transform, (M_PI / 2.0));
    self.view.transform = transform;
    }
    }

    -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
    }

    -(void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    }

    @end
    [/tt]
  • MinishlinkMinishlink Membre
    12:26 modifié #18
    Les coordonnées sont toujours au même endroit que si l'écran était normal.

    M'enfin c'est pas très grave, merci quand même :)
  • Eddy58Eddy58 Membre
    12:26 modifié #19
    Fonctionne très bien pour moi en tout cas.... ;)
  • MinishlinkMinishlink Membre
    12:26 modifié #20
    Moi j'ai une EAGLView, ça tourne bien mais le problème c'est que les coordonnées sont toujours les mêmes, ou bien les coordonnées de "touch" doivent elles aussi être transformées ?
  • Eddy58Eddy58 Membre
    12:26 modifié #21
    Ha tu es dans un contexte OpenGL, ça doit être différent et là  je n'ai pas expérimenté. Tu as essayé une rotation de la matrice avec les instructions GL ?
  • MinishlinkMinishlink Membre
    12:26 modifié #22
    Hum, je fais ça comment ? Je suis pas très expérimenté dans l'Open GL...
Connectez-vous ou Inscrivez-vous pour répondre.