web-dev-qa-db-fra.com

Comment rendre xib compatible avec les appareils iphone 5 et iphone 4

J'essaie de disposer mon xib de manière à ce qu'il soit compatible avec les appareils iphone 5 (rétine 4 pouces) et 3,5. 

Étant donné que je dois prendre en charge l'IOS-5, je ne peux pas utiliser l'autolayout. Je dois utiliser des ressorts et des Struts.

J'ai tout essayé en constructeur d'interface. Mais soit ma vision va au-delà du fond de l'iphone 3,5 pouces ou ne remplit pas complètement l'iPhone 4 pouces rétine. 

Quelqu'un peut-il donner un indice sur la manière de rendre un xib compatible avec les deux périphériques?

Pour plus de clarté, j'ajoute des captures d'écran:

Lorsque je définis la taille 3.5 dans l’inspecteur d’attributs: When I set size in attribute inspector to 3.5

il regarde dans iphone-5. Il y a un espace sous les boutons: And this is how it looks in simulator for 3.5 inch device

Si je règle la taille 4 pouces dans le constructeur d'interface. Vous pouvez voir que les boutons du bas ne sont pas visibles dans iphone-4 .If I set size 3.5 inch in interface builder

Vous allez donc demander quels sont les paramètres que j'utilise. Les voici:

enter image description hereenter image description hereenter image description here

45
user739711
  1. Vous ajoutez une nouvelle catégorie pour UIviewController et ajoutez ce code dans un fichier .h 

     - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil;
    
  2. Ajoutez ce code dans votre fichier .m 

     - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil
     {
       if (self = [super init])
     {
      self = [self initWithNibName:[self CheckDeviceIphone4:nibNameOrNil4 Iphone5:nibNameOrNil5 Ipad:nibNameOrNilpad] bundle:nibBundleOrNil];
      }
      return self;
    
    }
    
      -(NSString *)CheckDeviceIphone4:(NSString *)iphone4 Iphone5:(NSString *)iphone5 Ipad:(NSString *)ipad {
    
        return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) ? ipad :([[UIScreen mainScreen] bounds].size.height == 568) ?  iphone5 :iphone4;
      }
    
  3. Ouvrez le fichier YouProject-Prefix.pch et importez votre catégorie ici 

  4. maintenant vous utilisez juste ceci dans tout le projet comme celui-ci 

     self.firstView=[[firstView alloc]initWithNibNameforIphone4:@"firstView4" NibNameforIphone5:@"firstView" NibNameforIpad:@"firstViewIpad" bundle:[NSBundle mainBundle]];
    

    merci et toute question alors commentez et n'oubliez pas de upvote :-)

\

38
Waseem Shah

Essayez d’ajouter cela à tous vos contrôleurs devant prendre en charge l’iPhone 5:

- (void) loadView
{
    [super loadView];
    self.view.frame = [UIScreen mainScreen].bounds;
}
20
ivanzoid

Il suffit de définir la taille de la vue sur Aucune en utilisant Interface-builder
Cela prendra la taille de la vue au moment de l'exécution, il vous suffit de prendre soin de l'origine et de la taille automatique pour chaque élément (UILabel, UIImage, etc.) dans la vue.

  • Interface-builder (XIB) -> Inspecteur d'attributs -> Métriques simulées - Taille: Aucune

enter image description here

11
Navnath Godse

Je me débattais avec cela aujourd’hui, et quoi que j’ai fait, mon point de vue s’est toujours affiché en 320x480, même sur un simulateur de rétine 4 ". Même [UIScreen mainScreen] .bounds renvoyait en 320x480!

J'ai constaté que l'ajout de l'image de lancement de [email protected] était la clé pour qu'iOS reconnaisse mon application comme étant "prête" 4. Une fois que j'ai fait cela, je n'ai plus rien à faire pour que les plumes soient automatiquement dimensionnées sans les barres noires. Pas besoin d'avoir deux fichiers xib distincts, de modifier les paramètres dans Interface Builder, de surcharger loadView, etc.

6
Diarrhio

Si vous optez pour la solution consistant à utiliser 2 fichiers xib; dans votre méthode initWithNibName (), appelez simplement super avec le nom de nib différent. 

Je voudrais tester sur la dimension d'origine de 480 hauteur plutôt que sur la hauteur de 568 afin que le fichier xib plus grand soit sélectionné lorsque Apple publie un écran plus grand. À l'avenir, au moins le plus gros xib n'aura pas autant de boîtes aux lettres que le plus petit.

// From MainView.m
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
        self = [super initWithNibName:@"MainView" bundle:nibBundleOrNil];
    }
    else
    {
        // iPhone 5 or maybe a larger iPhone ??
        self = [super initWithNibName:@"MainView5" bundle:nibBundleOrNil];
    }

    return self;
}
3
Ed Trujillo

Vous n'avez pas besoin d'utiliser une pointe différente pour les périphériques 3,5 pouces et 4 pouces. Concevez l'application pour le périphérique 4 pouces et définissez AutoResizingMask correctement. Il devrait fonctionner correctement.

Dans votre cas, définissez simplement AutoResizingMask sur

[view setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];

Le masque de redimensionnement automatique place la vue correctement à sa position dans les deux appareils. 

3
MaheshShanbhag

J'avais aussi un problème avec 3,5 "contre 4", et j'ai mal compris ce qui n'allait pas, alors je voulais le documenter ici au cas où cela aiderait quelqu'un.

Si vous essayez d'accéder à self.view.frame, il ne sera pas correctement signalé avant le viewDidAppear ou un événement similaire. Si vous essayez d'accéder à self.view.frame à partir de viewDidLoad, vous pouvez alors indiquer les dimensions du cadre avant le redimensionnement automatique a lieu.

1
BigCheesy

J'ai une idée. Laissez séparer votre interface utilisateur en en-tête, corps et pied de page (comme un site Web). Ensuite, dans votre console de code, localisez l'inspecteur de taille et utilisez le redimensionnement automatique.

Remarquez les lignes extérieures du carré, c’est votre emplacement de contrôle par rapport à la vue principale. Définissez les commandes (barre de navigation, UIImageView, UIButton, etc.) dans la partie d'en-tête et la partie du corps attachées à Haut, ainsi que les commandes (Signet, Fermer, etc.) du bas de page.

À chaque exécution, les contrôles seront associés à leurs paramètres de redimensionnement automatique. Vous aurez un espace entre l'en-tête/le corps et le pied de page sur l'iPhone 5, mais je pense que ça va.

1
Shinigamae

Définissez la ligne ci-dessous et vérifiez la condition en fonction du périphérique.

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) 
if (IS_IPHONE_5) {
    btnBookmark.frame=CGRectMake(0, 460, 100, 70);
    btnBookmark.frame=CGRectMake(150, 460, 100, 70);
}
else {
    btnBookmark.frame=CGRectMake(0, 360, 100, 70);
    btnBookmark.frame=CGRectMake(150, 360, 100, 70);
}
1
Chris Alan

Sans utiliser autolayout, vous devrez peut-être gérer beaucoup de choses dans le code. Je suppose que la majeure partie de votre mise en page fonctionne bien avec des ressorts et des entretoises, mais que certains éléments de l'interface utilisateur ne peuvent pas définir simplement les cadres de certains objets en fonction de la taille de la vue. 

0
rooster117
  • Dans votre scénario, cliquez sur "Afficher l'inspecteur de fichier".
  • Dans le document Interface Builder Document-> Versioning de document, sélectionnez Deployment = iOS 5 (ou votre choix).

Si cela ne fonctionne pas, vous devez utiliser chacune de vos vues .. Sélectionnez-les. Sous Inspecteur d'attributs pour chacun d'eux, sous la section Vue, voir Attribut Mode. Définissez ceci sur 'Redessiner'.

Si cela ne donne pas un résultat satisfaisant, définissez la taille de la vue sur la plus petite des versions que vous utiliserez. Et définissez l'attribut Mode = 'Scale to fill'.

Par programme, l'attribut Mode est view.contentmode property.

0
Nirav Bhatt

l'extrait de code d'ivanzoid ci-dessus, qui interroge toute la taille de l'écran, fait l'affaire, à condition de ne pas oublier de soustraire les décalages de navigation et les barres d'outils (64 au total dans la plupart des conditions). 

C'est la hauteur de vue qui doit être ajustée; les ressorts et les jambes de force s'en occupent autrement. 

Nouveau test de mon application sur l'iPhone 5 Je n'avais à le faire que sur un seul écran avec quelques réglages de position de contrôle d'exécution. Tous les autres cas sont traités par défaut XIB.

0
Chris Fox

Si vous ne voulez pas utiliser deux xib et que vous voulez utiliser Autosizing here

0
the1pawan