Changer la view d'une window et placer des éléments dans une UIScrollView

bnkbnk Membre
juillet 2009 modifié dans API UIKit #1
Bonjour,

Je souhaite afficher une nouvelle view en plein écran paysage si j'incline mon iPhone.

Si je crée une nouvelle UIView ou ScrollView dans un .xib comment charger cette nouvelle vue?
Dois-je créer monController2 directement dans mon MainWindow et dire à  monAppDelegate de changer tabBar.monController.maView par monController2.view afin qu'il n'affiche plus le tabBar?

Jusque ici j'utilisais un controller par view et un tabBar pour manager mes controllers.
Est-ce la solution la mieux adaptée?

Je vois sur le schèma d'apple "..." sous view dans mon UIViewController.
Est-ce parceque nous pouvons controller plusieurs view avec un même controller? (je sais qu'on peut faire [monController setView:maView]; donc c'est possible mais comment faire au plus propre?)

Ensuite comment placer les éléments qui se trouvent en dehors de la partie visible de ma ScrollView sous IB (via le code en placant les coordonnées..)?

merci

Réponses

  • bnkbnk Membre
    juillet 2009 modifié #2
    vc-uitabbarctlr.jpg
  • bnkbnk Membre
    juillet 2009 modifié #3
    Ma question ne doit pas être claire...

    Et il y a deux questions en une, j'ai donc fait un mini projet juste avec ce qu'il faut pour répondre à  ma question concernant le changement de vue.

    C'est disponible ici: http://bnka.free.fr/beurdel/FichePoste.zip

    L'architecture est simple:

    MainWindow.xib -> tabBarController avec un seul tab
    MyViewInTab.xib -> la view affichée dans ce tabBar (contrôleur: myViewInTaBController)
    MyOtherView.xib -> une view indépendante (contrôleur: MyOtherView)

    Je souhaite que lorsque l'utilisateur utilise l'iPhone en landscape, on change la vue de ma window (le tabBar avec MyViewInTab à  l'intérieur) par une nouvelle vue : MyOtherView.

    Puis ensuite savoir comment faire pour changer la vue affichée par un contrôleur dans un tabBar.
    Merci !
  • Philippe49Philippe49 Membre
    08:40 modifié #4
    Pour réaliser cela, ma première idée aurait été :
    • de prendre un template View Based Application.
    • de configurer deux views en IBOutlet landscapeView et portaitView dans le xib appelé UntitiledViewController dans le template
    • Dans une des méthodes de basculement de l'iPhone, mettre

    <br />[code]&nbsp; &nbsp; &nbsp; if([landscapeView superview]!=nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [landscapeView removeFromSuperview];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.view=portraitView;<br />&nbsp; &nbsp; &nbsp; // mainWindow par ivar ou par UIApplication<br />&nbsp; &nbsp; &nbsp; }&nbsp; else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [landscapeView removeFromSuperview];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.view= landscapeView;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [mainWindow addSubview:self.view];<br />&nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; [mainWindow addSubview:self.view]; <br />
    

    Puis dans un deuxième temps de faire la même chose avec une animation, parce que comme cela c'est brutal.
  • bnkbnk Membre
    juillet 2009 modifié #5
    Merci pour ta réponse,

    J'ai donc mis mes view en outlet (chose à  laquelle je n'avais pas du tout pensé...)

    Ca fonctionne mais j'ai un problème d'affichage (il supporte mal l'orientation de l'iPhone, ca doit être parceque le controlleur n'est pas correctement relié à  ma view2).

    ada4fc7f06680f2665c98db9dc418.png

    <br />.h<br />#import &lt;UIKit/UIKit.h&gt;<br />#import &lt;Foundation/Foundation.h&gt;<br />#import &quot;FichePosteAppDelegate.h&quot;<br /><br />@interface myViewInTabController : UIViewController {<br />    IBOutlet UILabel *myLabel;<br />    IBOutlet UIView *myView1;<br />    IBOutlet UIView *myView2;<br />	FichePosteAppDelegate *appDelegate;<br />}<br /><br />@end<br /><br /><br />.m<br />#import &quot;myViewInTabController.h&quot;<br /><br />@implementation myViewInTabController<br /><br />- (void)viewDidLoad {<br />	[myLabel setText:@&quot;view1 in portrait&quot;];<br />}<br /><br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />	return YES;<br />}<br /><br />- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrien {<br />	//[self.view removeFromSuperview];<br />	[self setView:myView2];<br />	appDelegate = (FichePosteAppDelegate *)[[UIApplication sharedApplication] delegate];<br />	[[appDelegate window] addSubview:myView2];<br />}<br />@end<br />
    


    J'ai tenté de trouver des sample Apple pour me guider mais dans WichWayIsUp le contrôleur ne gère qu'une seule vue.


    edit: ce problème apparaà®t également quand je gère qu'une seule vue
    ba8c2c86e983611be75a01e0db905.png

    En fait la tranfo s'applique bien à  mon tabBar mais pas à  la vue qu'il contient.
    <br />- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrien {<br />	if(fromInterfaceOrien == UIInterfaceOrientationPortrait) [myLabel setText:@&quot;view in landscape&quot;];<br />	if(fromInterfaceOrien == UIInterfaceOrientationLandscapeLeft) [myLabel setText:@&quot;view in portrait&quot;];<br />	if(fromInterfaceOrien == UIInterfaceOrientationLandscapeRight) [myLabel setText:@&quot;view in portrait&quot;]<br />};
    
  • Philippe49Philippe49 Membre
    juillet 2009 modifié #6
    Il faut sans doute jouer sur les multiples méthodes de rotation : par exemple retirer la première vue dans dans didAnimateFirstHalf... et rajouter la seconde dans willAnimateSecond ..
    Lit la doc , elle dit à  quoi sert chacune d'entre elles

    Dans UIViewController, et dans le ViewController Programming Guide
    Responding to View Rotation Events
    

    – willRotateToInterfaceOrientation:duration: 
    – willAnimateRotationToInterfaceOrientation:duration: 
    – didRotateFromInterfaceOrientation: 
    – willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: 
    – didAnimateFirstHalfOfRotationToInterfaceOrientation: 
    – willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration: 
  • bnkbnk Membre
    juillet 2009 modifié #7
    Ouais, j'avais regardé la doc mais je trouvais que ca allait plus me compliquer la tâche qu'autre chose si je devais jongler entre toutes ces méthodes.

    J'ai trouvé comment faire:

    <br />#import &quot;myViewInTabController.h&quot;<br /><br />@implementation myViewInTabController<br /><br />- (void)viewDidLoad {<br />	[myLabel setText:@&quot;view1 in portrait&quot;];<br />	appDelegate = (FichePosteAppDelegate *)[[UIApplication sharedApplication] delegate];<br />}<br /><br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />	return YES;<br />}<br /><br />- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrien {<br />	<br />	if(fromInterfaceOrien == UIInterfaceOrientationPortrait) <br />	{<br />		[myLabel setText:@&quot;view in landscape&quot;];<br />		myTestView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 480.0f)];<br />		[myTestView setBackgroundColor:[UIColor blueColor]];<br />		[[appDelegate window] addSubview:myTestView];<br />		[myTestView release];<br />	}<br />	else {<br />		[myTestView removeFromSuperview];<br />	}<br />}<br />@end<br />
    


    Merci pour tes conseils, je dois trouver comment placer mes éléments à  la main dans mes UIView maintenant et voir si ça marche pour une ScrollView.

    Au fait, j'ai eu 20/20 à  mon stage en alternance en grande partie grâce aux conseils et explications trouvées sur osx-dev alors un grand merci !
  • Philippe49Philippe49 Membre
    08:40 modifié #8
    Félicitations. C'était quoi le sujet de ton stage ?
  • allianallian Membre
    08:40 modifié #9
    Moi ils m'ont embauché à  la suite de mon stage :D
    Mon sujet était le dev de deux applis iPhones. Du coup maintenant je les fignole pour une présence avant la fin de l'été sur l'AppStore
  • bnkbnk Membre
    juillet 2009 modifié #10
    dans 1246885503:

    Félicitations. C'était quoi le sujet de ton stage ?


    Je devais mettre en place une suite de logiciels de formation e-learning pour iPhone.
    Le contenu existait déjà  pour le web en flash... mon rôle était de reprendre les différents modules et d'adapter pour iPhone les cours mais aussi des activités pour vérifier les acquis sous forme de jeux (pendu, quizz, glisser/déplacer, association...) et d'études de cas (là  c'est spécifique pour chaque application).

    On a tous été gagnant, j'ai pu découvrir cocoa et le dev. iPhone m'organiser pour mener à  bien un projet de A à  Z en collaboration avec des graphistes puis de son coté l'entreprise se retrouve avec déjà  6-7 applications prêtes à  être balancées sur l'apple store dès que "les papiers" seront faits.

    Comme allian je prolonge mon stage à  temps plein jusque fin octobre, le lancement officiel de tout ceci se fera mi juillet. D'ici octobre j'ai encore une 50aine d'applis à  construire.

    Enfin je reviens sur la précieuse aide d'osx-dev car par exemple si Philippe49 n'avait pas passé 3h à  m'expliquer certains mécanismes de la dev iPhone j'aurai bien eu du mal à  mener à  bien tout ceci dans les temps! Merci aussi pour ton conseil concernant le fait de séparer bien chaque parties de mes applications ceci me permet aujourd'hui de reconstruire très facilement de nouvelles app rien qu'en en modifiant leur contenu par l'édition de fichiers xml.
Connectez-vous ou Inscrivez-vous pour répondre.