Question

Je mis à jour Xcode 4.2 et sa nouvelle fonctionnalité storyboards. Cependant, ne pouvait pas trouver un moyen de soutenir à la fois portrait et paysage.

Bien sûr, je l'ai fait un programme, avec 2 vues, un pour le portrait et un pour le paysage, comme dans les vieux jours, et:

if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    {
        self.view = self.landscapeView;
    }
    else
    {
        self.view = self.portraitView;
    }

Mais je cherchais une façon de le faire automatiquement en quelque sorte. Je veux dire, il est Xcode 4.2 maintenant, je me attendais plus de lui. Merci à tous.

==================================
SOLUTION TEMPORAIRE:

Je présenterai ici une solution temporaire. Je dis qu'il est temporaire, parce que je suis toujours en attente pour les gars d'Apple à faire quelque chose de vraiment intelligente à ce sujet.

J'ai créé un autre fichier .storyboard, appelé « MainStoryboard_iPhone_Landscape », et mis en œuvre la vue du paysage des contrôleurs là. En fait, il est exactement comme .storyboard normal (portrait), mais tous les écrans sont en mode paysage.

Je vais donc extraire le ViewController du story-board du paysage, et lorsque la rotation se produit, tout changement self.view avec la nouvelle vue de viewController.

Notifications 1.Generate lorsque des changements d'orientation:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

2.Look pour les notifications:

[[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceOrientationDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {    
    // We must add a delay here, otherwise we'll swap in the new view  
    // too quickly and we'll get an animation glitch  
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}];

3.Mettre updateLandscapeView

- (void)updateLandscapeView {  
 //>     isShowingLandscapeView is declared in AppDelegate, so you won't need to declare it in each ViewController
 UIDeviceOrientation deviceOrientation       = [UIDevice currentDevice].orientation;
 if (UIDeviceOrientationIsLandscape(deviceOrientation) && !appDelegate().isShowingLandscapeView)
 {
     UIStoryboard *storyboard                = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_Landscape" bundle:[NSBundle mainBundle]];
     MDBLogin *loginVC_landscape             =  [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
     appDelegate().isShowingLandscapeView    = YES;  
     [UIView transitionWithView:loginVC_landscape.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
         //>     Setup self.view to be the landscape view
         self.view = loginVC_landscape.view;
     } completion:NULL];
 }
 else if (UIDeviceOrientationIsPortrait(deviceOrientation) && appDelegate().isShowingLandscapeView)
 {
     UIStoryboard *storyboard                = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:[NSBundle mainBundle]];
     MDBLogin *loginVC                       = [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
     appDelegate().isShowingLandscapeView    = NO;
     [UIView transitionWithView:loginVC.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
         //>     Setup self.view to be now the previous portrait view
         self.view = loginVC.view;
     } completion:NULL];
 }}

Bonne chance à tout le monde.

P.S: Je vais accepter la réponse de l'annonce Taylor, parce que, après beaucoup de temps d'attente et la recherche d'une solution, je fini par mettre en œuvre quelque chose inspiré de sa réponse. Merci Taylor.

Était-ce utile?

La solution

Ceci est une vieille question, mais j'ai lu plus tôt dans la journée et a dû passer un montant équitable du travail à temps une meilleure solution. Je suis venu avec cette solution de piratage le d'Apple Autre vue exemple . Fondamentalement, il sert une vue modale pour la vue du paysage.

#pragma mark Rotation view control

- (void)orientationChanged:(NSNotification *)notification
{
    // We must add a delay here, otherwise we'll swap in the new view
    // too quickly and we'll get an animation glitch
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}

- (void)updateLandscapeView
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && !self.isShowingLandscapeView)
    {
        [self performSegueWithIdentifier: @"toLandscape" sender: self];
        self.isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait && self.isShowingLandscapeView)
    {
        [self dismissModalViewControllerAnimated:YES];
        self.isShowingLandscapeView = NO;
    }    
}


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

Autres conseils

Vous ne devriez pas généralement penser à des vues distinctes pour des orientations différentes sauf si elles sont très différentes (qui, sans doute, ils ne devraient pas être). Au lieu de cela, vous devez compter sur masques pour mettre un redimensionnement automatique comme une grande partie du contenu de votre point de vue basé sur les restrictions de base lorsque les changements du cadre de l'SuperView. Cela permettra de répondre de façon appropriée subviews à un changement dans le cadre de leur superview, souvent à la suite d'un changement d'orientation de l'interface.

Pour répondre à votre question plus directement, non, il n'y a aucun moyen pour Xcode d'assumer ou être dit que vous vues à utiliser pour une orientation d'interface particulière car cela n'a jamais été l'architecture intention de vue de UIKit.

Voici plus d'informations sur les masques d'un redimensionnement automatique: Traitement des changements de mise en page automatique à l'aide de règles Autoresizing.

Dans XCode v4.2.1 lors de l'utilisation storyboards vous ne pouvez changer l'orientation du contrôleur View, et non la vue elle-même, donc si vous avez inséré une autre vue là, vous ne serait pas en mesure de changer l'orientation de, même si vous pourrait voir la vue correctement.

Ainsi, la manière précédente d'avoir deux points de vue ne semblent fonctionner lors de l'utilisation storyboards (lors de l'utilisation de NIB où la vue est variable Orientation pour les vues séparées).

scroll top