Dans le milieu du développement iOS, l’utilisation des storyboards est assez controversée. Aujourd’hui nous allons voir comment se passer des storyboards et gérer nos interfaces utilisateurs à la main.

Qu’est-ce qu’un storyboard ?

Pour reprendre la définition officielle d’Apple:

Un storyboard est une représentation visuelle de l’interface utilisateur d’une application iOS, montrant des écrans de contenu et les connexions entre ces écrans. Un storyboard est composé d’une séquence de scènes, chacune représentant un contrôleur de vue et ses vues ; les scènes sont reliées par des objets enchaînés, qui représentent une transition entre deux contrôleurs de vue.

Nous pouvons retrouver dans Xcode un éditeur de storyboard qui permet de rajouter facilement des éléments dans nos écrans avec un simple glisser-déposer.

Storyboard

Pourquoi supprimer les storyboards ?

Comme dit plus haut, l’utilisation des storyboards est assez controversée et certains développeurs préfèrent s’en passer et créer le design de leurs applications avec du code directement.

Mais pourquoi vouloir supprimer les storyboards ? Bien qu’il existe une multitude de réponses à cette question je me contenterai de citer les deux qui m’ont fait me passer des storyboards.

1. C’est lent

On retrouve dans un storyboard toutes les informations d’un écran jusqu’à ses moindres subtilités. Que ce soit la taille de l’écran, la couleur d’un bouton, à combien de pixel ce bouton doit se situer du côté droit de l’écran, du côté gauche de l’écran, et j’en passe..

Le problème avec ceci c’est qu’Xcode affiche toutes ces informations dans son éditeur de storyboard, et plus le projet va grandir, plus ça deviendra long d’ouvrir et d’éditer ces fameux storyboards.

2. Les modifications sont fastidieuses

Une fois que tous vos écrans sont créés il devient très difficile de modifier certaines choses. Par exemple, si un jour vous décidez de changer la police d’écriture de votre application, vous devrez parcourir tous les éléments suceptible d’afficher du texte, dans tous les écrans, dans tous vos storyboards. Une tâche qui peut se montrer très longue et fastidieuse, sans compter les multitude d’oublis potentiels.

Comment procéder ?

1. Créer un nouveau projet

Nous allons commencer par créer un nouveau projet.

1

Il faut bien veiller à ce que User interface soit bien définit sur Storyboard et non sur SwiftUI.

2

2. Supprimer le storyboard

Une fois le projet crée, nous allons sélectionner Main.storyboard dans le Navigateur (à gauche) et nous allons le supprimer. Sur la pop-up qui va s’afficher, nous appuierons sur Move to trash.

3

3. Supprimer l’interface principale

Nous allons maintenant sélectionner notre projet dans le Navigateur (ici NoStoryboards), et nous rendre sur l’onglet General. Puis, dans le champ Main Interface et nous allons supprimer le mot Main qui s’y trouve.

4

4. Supprimer la référence dans le fichier Info.plist

Ouvrons le fichier Info.plist, nous allons localiser la valeur Storyboard Name située dans Application Scene Manifest > Scene Configuration > Application Session Role > Item 0 (Default Configuration) et appuyer sur le bouton - pour la supprimer.

5

5. Ajouter la vue de base

À présent nous allons nous rendre dans le fichier SceneDelegate.swift et ajouter le code suivant dans la fonction scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)

guard let windowScene = (scene as? UIWindowScene) else { return }

window = UIWindow(frame: windowScene.coordinateSpace.bounds)
window?.windowScene = windowScene
window?.rootViewController = ViewController()
window?.rootViewController?.view.backgroundColor = .white
window?.makeKeyAndVisible()

6

Et voilà ! Notre application peut désormais se lancer sans storyboard. Mais ce n’est pas finit pour autant, il nous faut maintenant voir comment ajouter des éléments d’interface directement depuis le code.

Comment ajouter des éléments

Pour l’exemple, nous allons voir comment ajouter un simple label dans notre application. Commençons par ouvrir le fichier ViewController.swift.

Nous allons commencer par créer un simple label comme il suit:

let label = UILabel()

Par la suite nous allons pouvoir customiser notre label dans la fonction viewDidLoad. Dans cette exemple, nous allons lui assigner du texte comme ceci:

label.text = "Hello World"
label.translatesAutoresizingMaskIntoConstraints = false

Il faut ensuite l’ajouter en tant que subView dans la view du viewController:

view.addSubview(label)

Il ne nous reste plus qu’a définir les contraintes de notre label afin de le postionner ou nous voulons. Ici nous allons le placer au centre de la vue. Nous allons placer le code des contraintes dans une fonctions à part que nous appelerons depuis viewDidLoad pour plus de clarté et de propreté.

private func setupConstraints() {
    label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}

Ce qui nous donne pour finir:

7

Et sur le simulateur:

8

Et voilà comment ajouter des nouveaux éléments depuis du code. Pour ma part, je trouve que la gestion des contraintes n’est pas très intuitive nativement. Dans un prochain article je vous montrerai quelques librairies qui ont pour but de rendre l’écriture des contraintes beaucoup plus simple et intuitive.