Double Possible:
Comment développer ou migrer des applications pour l'iPhone 5 résolution de l'écran?Je me demandais juste comment devrions-nous traiter avec l'iPhone 5 plus grande taille d'écran.
Car il a plus de pixels en hauteur, des choses comme GCRectMake que l'utilisation de coordonnées (et juste doublé les pixels de la rétine/non rétine problème) ne fonctionne pas de manière transparente entre les versions, comme c'est arrivé lorsque nous avons eu la Rétine.
Et aurons-nous à la conception de deux storyboards, tout comme pour l'iPad?
Personnellement, je ne pense pas que Apple va vous obliger à vérifier la taille de l'écran chaque fois que vous avez à en tirer quelque chose, comme beaucoup de réponses le dire. Est-ce possible avec l'iPad?
Réponses
Trop de publicités?Toutes les applications continuent à fonctionner dans le étirée verticalement écran de ce que je pourrais dire dans la présentation d'aujourd'hui. Ils seront letterbox ou essentiellement extra 88 points en hauteur serait tout simplement noir.
Si vous n'plan de soutien de l'iOS 6+, alors certainement envisager l'utilisation de l'Auto Mise en page. Il supprime toutes les disposition fixe de manutention et utilise à la place de contraintes pour poser les choses. Rien ne sera codée en dur, et votre vie deviendra beaucoup plus simple.
Toutefois, si vous avez de soutenir les anciens iOS, puis cela dépend vraiment de votre application. La majorité des applications qui utilisent une barre de navigation standard, et/ou de la barre d'onglet, pourrait tout simplement élargir le contenu dans le milieu pour utiliser des points supplémentaires. Définir le d'un redimensionnement automatique masque du centre de contenu à se développer dans deux directions.
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Il fonctionne très bien hors de la boîte pour table de points de vue, toutefois, si votre application utilisée pixel-perfect mise en page pour l'affichage d'un contenu, alors votre meilleur pari serait de ré-imaginer le contenu, de sorte qu'il peut s'adapter à différentes hauteurs.
Si ce n'est pas une possibilité, alors la seule option restante est d'avoir deux interfaces utilisateur (avant l'iPhone 5 et l'iPhone 5).
Si ça sonne moche, alors vous pouvez aller avec la valeur par défaut "letterbox" modèle où le plus de points/pixels tout simplement noir.
Modifier
Pour permettre à vos applications de travailler avec l'iPhone 5, vous devez ajouter de la rétine version du lanceur de l'image. Il devrait être nommé Default-568h@2x.png
. Et il doit être de qualité rétine - il n'y a pas de compatibilité ascendante ici :)
Vous pouvez également sélectionner cette image dans Xcode. Aller à la cible, et en vertu de la section Résumé, regardez pour le Lancement des Images. L'image doit être 640x1136 pixels dans la taille. Voici une capture d'écran de l'endroit où le trouver, si cela aide.
Vous avez besoin d'ajouter un 640x1136 pixels PNG image (Default-568h@2x.png
) par 4 pouces par défaut splash image de votre projet, et il va utiliser des espaces supplémentaires (sans les efforts sur simple table en fonction des applications, des jeux nécessitera plus d'efforts).
J'ai créé une petite UIDevice catégorie, afin de traiter toutes les résolutions d'écran. Vous pouvez l'obtenir ici, mais le code est comme suit:
Fichier UIDevice+Résolutions.h:
enum {
UIDeviceResolution_Unknown = 0,
UIDeviceResolution_iPhoneStandard = 1, // iPhone 1,3,3GS Standard Display (320x480px)
UIDeviceResolution_iPhoneRetina4 = 2, // iPhone 4,4S Retina Display 3.5" (640x960px)
UIDeviceResolution_iPhoneRetina5 = 3, // iPhone 5 Retina Display 4" (640x1136px)
UIDeviceResolution_iPadStandard = 4, // iPad 1,2,mini Standard Display (1024x768px)
UIDeviceResolution_iPadRetina = 5 // iPad 3 Retina Display (2048x1536px)
}; typedef NSUInteger UIDeviceResolution;
@interface UIDevice (Resolutions)
- (UIDeviceResolution)resolution;
NSString *NSStringFromResolution(UIDeviceResolution resolution);
@end
Fichier UIDevice+Résolutions.m:
#import "UIDevice+Resolutions.h"
@implementation UIDevice (Resolutions)
- (UIDeviceResolution)resolution
{
UIDeviceResolution resolution = UIDeviceResolution_Unknown;
UIScreen *mainScreen = [UIScreen mainScreen];
CGFloat scale = ([mainScreen respondsToSelector:@selector(scale)] ? mainScreen.scale : 1.0f);
CGFloat pixelHeight = (CGRectGetHeight(mainScreen.bounds) * scale);
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
if (scale == 2.0f) {
if (pixelHeight == 960.0f)
resolution = UIDeviceResolution_iPhoneRetina4;
else if (pixelHeight == 1136.0f)
resolution = UIDeviceResolution_iPhoneRetina5;
} else if (scale == 1.0f && pixelHeight == 480.0f)
resolution = UIDeviceResolution_iPhoneStandard;
} else {
if (scale == 2.0f && pixelHeight == 2048.0f) {
resolution = UIDeviceResolution_iPadRetina;
} else if (scale == 1.0f && pixelHeight == 1024.0f) {
resolution = UIDeviceResolution_iPadStandard;
}
}
return resolution;
}
@end
C'est la façon dont vous avez besoin pour utiliser ce code.
1) Ajoutez le au-dessus de UIDevice+Résolutions.h & UIDevice+Résolutions.m des fichiers à votre projet
2) Ajouter la ligne #import "UIDevice+Résolutions.h" à vos ViewController.m
3) Ajouter ce code pour vérifier quelles sont les versions d'appareil que vous faites affaire avec
int valueDevice = [[UIDevice currentDevice] resolution];
NSLog(@"valueDevice: %d ...", valueDevice);
if (valueDevice == 0)
{
//unknow device - you got me!
}
else if (valueDevice == 1)
{
//standard iphone 3GS and lower
}
else if (valueDevice == 2)
{
//iphone 4 & 4S
}
else if (valueDevice == 3)
{
//iphone 5
}
else if (valueDevice == 4)
{
//ipad 2
}
else if (valueDevice == 5)
{
//ipad 3 - retina display
}
Je viens de terminer la mise à jour et l'envoi d'un iOS version 6.0 de l'une de mes Applications dans le store. Cette version est compatible avec iOS 5.0, donc j'ai gardé l' shouldAutorotateToInterfaceOrientation:
méthode et ajouté de nouveaux, comme indiqué ci-dessous.
J'ai eu à faire ce qui suit:
L'Autorotation est en train de changer dans iOS 6. Dans iOS 6, l' shouldAutorotateToInterfaceOrientation:
méthode de UIViewController est obsolète. À sa place, vous devez utiliser l' supportedInterfaceOrientationsForWindow:
et shouldAutorotate
méthodes.
Donc, j'ai ajouté ces nouvelles méthodes (et gardé l'ancienne pour iOS 5 compatibilité):
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- Utilisé le point de vue du contrôleur
viewWillLayoutSubviews
méthode et ajuster la mise en page à l'aide de la vue les limites d'un rectangle. -
Modal vue contrôleurs: L'
willRotateToInterfaceOrientation:duration:
,willAnimateRotationToInterfaceOrientation:duration:
, etdidRotateFromInterfaceOrientation:
méthodes ne sont plus appelés sur tout-vue-contrôleur qu'une présentation à l'écran plus
lui-même-par exemple,presentViewController:animated:completion:
. - Ensuite, j'ai fixé la mise en page automatique pour les vues qui en avait besoin.
- Les images copiées à partir du simulateur pour le démarrage de la vue et les vues de l'iTunes store dans PhotoShop et exportés en tant que fichiers png.
- Le nom de l'image par défaut est:
Default-568h@2x.png
et la taille est de 640×1136. De son a également permis de fournir 640×1096 pour le même mode portrait (Barre de statut est supprimé). Tailles similaires peuvent également être fournies en mode paysage si votre application permet uniquement le mode paysage sur l'iPhone. - J'ai abandonné la rétro-compatibilité iOS 4. La principale raison pour cela est parce que le soutien pour
armv6
code a été supprimé. Ainsi, tous les appareils que je suis en mesure de soutenir maintenant (exécutantarmv7
) peut être mis à niveau vers iOS 5. - Je suis aussi de la génération armv7s code pour prendre en charge l'iPhone 5, et peut donc ne pas utiliser un tiers des cadres (comme Admob, etc.) jusqu'à ce qu'ils sont mis à jour.
C'était tout, mais rappelez-vous juste pour tester l'autorotation dans iOS 5 et iOS 6, à cause des changements dans la rotation.
@interface UIDevice (Screen)
typedef enum
{
iPhone = 1 << 1,
iPhoneRetina = 1 << 2,
iPhone5 = 1 << 3,
iPad = 1 << 4,
iPadRetina = 1 << 5
} DeviceType;
+ (DeviceType)deviceType;
@end
.m
#import "UIDevice+Screen.h"
@implementation UIDevice (Screen)
+ (DeviceType)deviceType
{
DeviceType thisDevice = 0;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
{
thisDevice |= iPhone;
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
thisDevice |= iPhoneRetina;
if ([[UIScreen mainScreen] bounds].size.height == 568)
thisDevice |= iPhone5;
}
}
else
{
thisDevice |= iPad;
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
thisDevice |= iPadRetina;
}
return thisDevice;
}
@end
De cette façon, si vous voulez détecter si c'est juste un iPhone ou iPad (indépendamment de la taille de l'écran), il vous suffit d'utiliser:
if ([UIDevice deviceType] & iPhone)
ou
if ([UIDevice deviceType] & iPad)
Si vous voulez détecter seulement l'iPhone 5, vous pouvez utiliser
if ([UIDevice deviceType] & iPhone5)
Contrairement à Malcoms réponse où vous auriez besoin de vérifier simplement à savoir si c'est un iPhone,
if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes ||
[UIDevice currentResolution] == UIDevice_iPhoneStandardRes ||
[UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`
Ni a un avantage majeur sur l'un de l'autre, c'est juste une question de préférence personnelle.