34 votes

gestion de l'orientation iphone / ipad

C'est plus une question d'ordre général pour les personnes à me donner des conseils sur, essentiellement Im apprentissage de l'iPad/iPhone de développement et finalement, à venir à travers le multi-orientation de la question.

J'ai regardé une bonne quantité de doco, et mon livre "à partir de l'iPhone 3 de Développement" a un beau chapitre sur elle.

Mais ma question est la suivante, si j'en programmant changer mes contrôles (ou même utiliser des points de vue différents pour chaque orientation), comment sur terre pour les gens à garder leur code de base? Je peux juste imaginer beaucoup de problèmes avec code spaghetti/des milliers de "si" vérifie tous sur la place, qu'il me conduira à la noix pour faire une petite modification dans l'arrangement de l'INTERFACE utilisateur.

Quelqu'un aurait-il l'expérience de la manipulation de ce problème? Ce est une belle façon de le contrôler?

Merci beaucoup Marque

41voto

Alex Reynolds Points 45039

Je le fais avec deux méthodes simples dans mon contrôleur de vue:

 - (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self adjustViewsForOrientation:toInterfaceOrientation];
}

- (void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation {
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
        titleImageView.center = CGPointMake(235.0f, 42.0f);
        subtitleImageView.center = CGPointMake(355.0f, 70.0f);
        ...
    }
    else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) {
        titleImageView.center = CGPointMake(160.0f, 52.0f);
        subtitleImageView.center = CGPointMake(275.0f, 80.0f);
        ...
    }
}
 

Pour garder cela propre, vous pouvez facilement compartimenter les réglages de vue / rechargement / etc. avec des méthodes appelées de l'intérieur du single if-else conditionnel.

7voto

drawnonward Points 35444

Cela dépend vraiment de ce que vous êtes à la pose.

Si vous regardez la Pomme Paramètres de l'application, vous pouvez voir qu'ils utilisent des vues de table pour la mise en page, avec les cellules pour la plupart des lignes. Avec cela, vous pouvez permettre à une interface simple pour faire tourner assez bon marché par remplissage juste la largeur des cellules. Cela s'applique même à des choses comme la poste, où il y a de modifier le texte des cellules de chaque ligne. Et les tables peuvent facilement être totalement transparent, avec seulement les boutons ou les étiquettes visibles, de sorte qu'ils ne regardent pas comme des tableaux.

Vous pouvez obtenir beaucoup de kilométrage de la autoresizingMask de chaque UIView. Si vous avez un ou plusieurs éléments qui peuvent avoir un flexible de la hauteur, alors vous pouvez généralement obtenir une interface de mise en page qui semble bon dans l'orientation. Selon la façon dont il semble, parfois, vous pouvez simplement la broche tout en haut.

Dans de rares cas, si tous les éléments de l'interface tenir dans un carré, vous pouvez simplement les faire pivoter en place.

Il y a deux moments où vous devez traiter explicitement les changements d'orientation. L'un est lorsque la vue se déplace de côté au-dessous de l'autre sur la rotation. L'autre, c'est quand vous avez des images différentes pour chaque orientation, par exemple, si vous souhaitez toujours être pleine largeur.

Il y a parfois des façons de contourner les deux de ces. Vous pouvez utiliser extensible images ou de vous limiter à une seule vue par ligne. Ou vous pouvez verrouiller l'orientation de certains points de vue.

Si vous devez modifier la présentation de points de vue, il est explicite layoutSubviews méthode. Vous devriez essayer de répondre à tous que vous conditionnelle de mise en page dans cette méthode. Il est seulement appelé lors de l'affichage des limites de changement, par exemple la rotation, ou si vous avez fait de la place pour le clavier. Faire un affichage personnalisé pour chaque vue de la hiérarchie qui doit répondre à la rotation, et la mise en page de la sous-vues à partir de là.

2voto

Winder Points 1257

Le SDK de l'iPhone est construit autour d'avoir une architecture MVC, donc, en théorie, si vous gardez toute votre logique (modèle) séparé de votre INTERFACE utilisateur (vue) alors vous aurez seulement à se soucier de l'INTERFACE utilisateur en un seul endroit: votre point de vue contrôleurs. Pour ceux, vous pouvez avoir une vue séparée contrôleur pour chaque orientation, dont chacun serait alors juste être chargé avec un if/else pour choisir la vue du contrôleur de charge.

La même idée se tient pour iPhone / iPad, où vous pouvez charger un autre point de vue contrôleur qui permet de traiter de plus grands écrans.

1voto

symadept Points 16

0voto

johndpope Points 1485

Je ne peux pas garantir ce code et, en toute honnêteté, ce qui précède willRotateToInterfaceOrientation fonctionne très bien. Voici une autre prise avec FBDialog.m de Facebook pour iphone / ipad. (bien que je pense que c'était pour une webview)

voici l'essentiel

 [[NSNotificationCenter defaultCenter] addObserver:self
  selector:@selector(deviceOrientationDidChange:)
  name:@"UIDeviceOrientationDidChangeNotification" object:nil];


- (void)deviceOrientationDidChange:(void*)object {
  UIDeviceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
  if ([self shouldRotateToOrientation:orientation]) {


    CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:duration];
    [self sizeToFitOrientation:YES];
    [UIView commitAnimations];
  }
}


-(CGAffineTransform)transformForOrientation {
  UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
  if (orientation == UIInterfaceOrientationLandscapeLeft) {
    return CGAffineTransformMakeRotation(M_PI*1.5);
  } else if (orientation == UIInterfaceOrientationLandscapeRight) {
    return CGAffineTransformMakeRotation(M_PI/2);
  } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
    return CGAffineTransformMakeRotation(-M_PI);
  } else {
    return CGAffineTransformIdentity;
  }
}

- (void)sizeToFitOrientation:(BOOL)transform {
  if (transform) {
    self.transform = CGAffineTransformIdentity;
  }

  CGRect frame = [UIScreen mainScreen].applicationFrame;
  CGPoint center = CGPointMake(
    frame.origin.x + ceil(frame.size.width/2),
    frame.origin.y + ceil(frame.size.height/2));

  CGFloat scale_factor = 1.0f;
  if (FBIsDeviceIPad()) {
    // On the iPad the dialog's dimensions should only be 60% of the screen's
    scale_factor = 0.6f;
  }

  CGFloat width = floor(scale_factor * frame.size.width) - kPadding * 2;
  CGFloat height = floor(scale_factor * frame.size.height) - kPadding * 2;

  _orientation = [UIApplication sharedApplication].statusBarOrientation;
  if (UIInterfaceOrientationIsLandscape(_orientation)) {
    self.frame = CGRectMake(kPadding, kPadding, height, width);
  } else {
    self.frame = CGRectMake(kPadding, kPadding, width, height);
  }
  self.center = center;

  if (transform) {
    self.transform = [self transformForOrientation];
  }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X