Xcode: Mise à jour app de IOS6 vers IOS7

jeudi 27 mars 2014

Voici les nombreux changements que j’ai dû opérer lors de la mise à jour d’une de mes applications de IOS6 à IOS7.

Premièrement, mettre à jour le deployment target et la version de mon application

Ensuite, j’ai corrigé les nombreux warning IOS6 ou IOS7 deprecated

Voici quelques exemples de conversion de codes:

//IOS6
CGSize size = [calloutLabel.text sizeWithFont:calloutLabel.font];
//IOS7
CGSize size = [calloutLabel.text sizeWithAttributes:@{NSFontAttributeName:calloutLabel.font}];
//IOS6
[self presentModalViewController:picker animated:YES];
//IOS7
[self presentViewController:picker animated:YES completion:nil];
//IOS6
[self dismissModalViewControllerAnimated:YES];
//IOS7
[self dismissViewControllerAnimated:YES completion:nil];
//IOS6
 label.textAlignment = UITextAlignmentCenter;
//IOS7
label.textAlignment = NSTextAlignmentLeft;

Xcode vous demandera aussi dans un warning du projet de « validate project settings update to recommended settings », vous pouvez demander à Xcode de corriger ces warnings lui même mais si comme moi, vous avez des libraries qui ne tourne pas en 64bits, je vous recommande de décocher l’option « Automatically select architectures », sinon vous êtes bon pour retrouver cette librairie en 64bits en étant sur que le développeur de cette librairie l’ait fait !
IOS 7 utilise maintenant une architecture 64bits, c’est pourquoi Xcode recommande de changer les architectures.
Pour rendre vos applications compatibles pour iPhone 5s et les anciens modèles (jusqu’à iPhone 3Gs courir iOS6), sélectionnez l’option suivante pour vos architectures – «Architectures standard – ARMv7, armv7s ». Ne sélectionnez pas l’option qui dit « Architectures standard (y compris 64 bits) … ».

ARCHS = armv7s ARMv7
Pour des architectures valides dans les paramètres de génération, vous pouvez spécifier arm64, ARMv7, armv7s.
VALID_ARCHS = armv7s ARMv7 ARMv6 arm64 
Architecture

Il faut aussi si on utilise cocoapods changer le paramètre « Build Active Architecture Only » et le mettre à NO, il faut mettre cela dans Build Settings de votre projet et de Pods!

Maintenant, il reste les problèmes de layout.

UIStatusBar et UINavigationController

Si comme moi, vous aviez une navigationController et la statusbar apparente, sous IOS7, si vous avez une image de fond dans la navigationbar, il faut l’agrandir jusque la statusbar y compris! Car en faite sous IOS7, la status bar est transparente! Donc l’image maintenant doit faire 320×64 et 640×128(@2x)

UITableView

Voici le code pour designer l’index de la tableview.

[[self tableView] setSectionIndexColor:[UIColor colorWithRed:0.161 green:0.294 blue:0.506 alpha:1]];
[[self tableView] setSectionIndexBackgroundColor:[UIColor clearColor]];

UITabBar

Voici le code pour changer les couleurs de la tabbar

[[UITabBar appearance] setTintColor:[UIColor colorWithRed:92/255.0 green:119/255.0 blue:169/255.0 alpha:1]];
[[UITabBar appearance] setBarTintColor:[UIColor colorWithRed:224/255.0 green:247/255.0 blue:236/255.0 alpha:1]];

Un autre bug graphique auquel j’ai été confronté durant le passage de IOS6 à IOS7, c’est qu’au niveau des xib, les éléments positionner parfois passe sous la top bar et la tabbar qui sont sous IOS 7 translucide et dont le contenu peux passer en dessous de ceux-ci.
De plus, les tailles de ces éléments ont changé.
Sous IOS7, les viewcontrollers utilisent la totalité de l’écran donc Apple a introduit une nouvelle propriété appelée

[UIViewController setEdgesForExtendedLayout:]
dont la default value est UIRectEdgeAll.Et donc par défaut quand votre container est une UInavigationController, le layout commence au top de votre navigation par défaut, c’est pourquoi les UI elements doivent avoir un décalage de 44 pt.
L’issue à ce problème est la suivante:
//Permet de vérifier que la méthode existe ( sous IOS 7)
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
   self.edgesForExtendedLayout = UIRectEdgeNone;
}
A placer dans le viewDidLoad.

La fonction respondsToSelector est très importante si votre application doit tourner sur plusieurs version de IOS!
Car elle permet de s’assurer que la fonction est bien définie sous la version IOS de l’utilisateur!

Si vous avez d’autres erreurs, cliquez ici pour toute la documentation Apple pour la transition de IOS6 vers IOS7 et aussi comment maintenir les deux.

Tags: IOS6 , IOS7 , respondsToSelector