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:
il regarde dans iphone-5. Il y a un espace sous les boutons:
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 .
Vous allez donc demander quels sont les paramètres que j'utilise. Les voici:
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;
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;
}
Ouvrez le fichier YouProject-Prefix.pch et importez votre catégorie ici
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 :-)
\
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;
}
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.
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.
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;
}
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.
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.
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.
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); }
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.
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.
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.
Si vous ne voulez pas utiliser deux xib et que vous voulez utiliser Autosizing here