Quelle est la meilleure façon de tirer parti de la nouvelle mise en page automatique fonctionnalités de l'iOS 6 tout en offrant la compatibilité avec les appareils plus anciens, sur des versions antérieures d'iOS?
Réponses
Trop de publicités?Mise en page automatique peut être activée ou désactivée sur chaque .storyboard ou .xib fichier. Il suffit de sélectionner le fichier et de modifier les "Utiliser la mise en forme automatique" de la propriété à l'aide de l'inspecteur de Fichiers dans Xcode:
À l'aide de mise en page automatique activé fichiers d'interface avec la cible de déploiement définie à une iOS version antérieure à la version 6.0 résultats dans les erreurs de compilation, par exemple:
Erreur dans MainStoryboard.storyboard:3: Mise en page Automatique sur iOS Versions antérieures à la version 6.0
Une de vos options pour utiliser la mise en forme automatique dans un projet et de préserver la compatibilité avec l'iOS4-5 est de créer deux objectifs: l'un pour cible de déploiement iOS 6.0 et un pour une précédente version d'iOS, par exemple:
Vous pouvez créer deux versions de chaque de votre scénario et XIB fichiers et utiliser la mise en page automatique activé avec la 6.0 cible et l'autre avec le legs de la cible, par exemple:
Vous pouvez ensuite ajouter MainStoryBoardAutoSize à l'iOS6 cible phases de construction et de l'autre fichier pour l'iOS4 cible. Vous pouvez en apprendre plus sur l'utilisation de plusieurs cibles d' ici.
EDIT: Comme marchinram la réponse de points, si vous chargez vous storyboard fichiers de code et de ne pas utiliser le "Storyboard" dans Xcode pour la table de montage séquentiel, vous pouvez utiliser une cible unique.
Pour moi, le coût de la complexité accrue de la gestion de plusieurs cibles et des fichiers d'interface semble l'emporter sur les avantages de l'utilisation de la mise en page automatique. À l'exception de quelques cas particuliers, vous êtes probablement beaucoup mieux d'utiliser un bon vieux ajustement automatique de la taille (ou layoutSubViews de code), exclusivement si l'iOS4-5 compatibilité est nécessaire.
Avez-vous vraiment besoin de deux objectifs? Je l'ai eu à travailler comme cela, j'ai 2 storyboard comme Imre Kelényi dit, l'une avec automatique des mises en page activé et l'autre sans, puis dans l'app délégué je viens de vérifier la version qu'ils utilisent et de sélectionner le bon storyboard:
#import "AppDelegate.h"
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:(v) options:NSNumericSearch] != NSOrderedAscending)
@interface AppDelegate ()
@property (strong, nonatomic) UIViewController *initialViewController;
@end
@implementation AppDelegate
@synthesize window = _window;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIStoryboard *mainStoryboard = nil;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
mainStoryboard = [UIStoryboard storyboardWithName:@"iPhone_iOS6" bundle:nil];
} else {
mainStoryboard = [UIStoryboard storyboardWithName:@"iPhone_iOS5" bundle:nil];
}
self.initialViewController = [mainStoryboard instantiateInitialViewController];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = self.initialViewController;
[self.window makeKeyAndVisible];
return YES;
}
@end
Avoir 2 objectifs œuvres aswell mais semble exagéré pour moi
Si la mise en page les différences ne sont pas grandes, il est beaucoup plus facile d'utiliser les Ressorts et les jambes de force à la position des éléments.
Inspiré par @marchinram une cible idée, c'est la solution que j'ai enfin trouvé. Deux storyboards, l'une pour les jambes de suspension et ressorts pour la mise en page automatique. Dans la cible résumé, j'ai réglé la mise en page automatique storyboard en tant que par défaut. Puis, dans l'appDelegate, je vérifie si j'ai besoin de charger la pré-6.0 struts-et-ressorts storyboard, après tout:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
Class cls = NSClassFromString (@"NSLayoutConstraint");
if (cls == nil) {
NSString *mainStoryboardName = nil;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
mainStoryboardName = @"MainStoryboard_iPad_StrutsAndSprings";
} else {
mainStoryboardName = @"MainStoryboard_iPhone_StrutsAndSprings";
}
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:mainStoryboardName bundle:nil];
UIViewController *initialViewController = [mainStoryboard instantiateInitialViewController];
self.window.rootViewController = initialViewController;
[self.window makeKeyAndVisible];
}
J'ai aussi réglé la cible de déploiement de, les amortisseurs et les ressorts de storyboard pour iOS 5.1, et que de la mise en page automatique storyboard de Projet SDK(iOS 6.0).
Je voulais vraiment faire, le commutateur avant la valeur par défaut dans la table de montage est chargé, dans willFinishLaunchingWithOptions: mais que les résultats dans un "NSInvalidUnarchiveOperationException', la raison: "ne Peut pas instancier la classe nommée NSLayoutConstraint peu importe ce que j'ai essayé.
Essayez d'utiliser RRAutoLayout: https://github.com/RolandasRazma/RRAutoLayout C'est iOS6 mise en page automatique backport pour iOS5.