HisTech Up

Xamarin: Stratégie de partage de code pour iOS et OS X

Introduction

user

Christian Hissibini

I am a Tech enthusiast who loves to blend Dev & Design on Web and Mobile Platforms. I am also a Windows Platform Dev MVP


LATEST POSTS

Walkthrough: Data Binding for UWP – Part 3 – Compiled Binding 31st March, 2016

Walkthrough: Data Binding for UWP – Part 2 – Converters 31st March, 2016

Xamarin

Xamarin: Stratégie de partage de code pour iOS et OS X

Posted on .

L’un des atouts majeurs de Xamarin est le partage du code C# entre les différentes plateformes mobiles. Cependant Xamarin permet aussi de cibler la ligne de systèmes d’exploitation OS X de la plateforme Mac. Si vous vous aventurez dans le développement d’application iOS en utilisant Xamarin.iOS, vous serez sans doute surpris de constater la quantité de code pouvant être partagé entre iOS et OS X. Dans ce billet vous verrez quelques trucs et astuces permettant d’optimiser le partage de code entre les deux plateformes.

Partage naturel de code

iOS et OS X partagent une architecture commune, ce qui résulte naturellement sur une superbe histoire de partage de code. Plusieurs classes sont à la fois compatibles sur les deux plateformes sans aucune modification and avec la sortie récente de l’API Unifiée, Xamarin a rendu le partage de code entre iOS et OS X encore plus facile.
Avant de commencer à déverser tout notre code existant Xamarin.iOS dans un nouveau projet Xamarin.Mac, il convient de distinguer ce que nous devons partager et ce que nous devons laisser indépendant à chaque plateforme. Le pattern architectural le plus commun pour le développement iOS et OS X est le pattern MVC (Modèle Vue Contrôleur). Il permet d’augmenter la quantité de code réutilisé dans nos applications dans la mesure où plusieurs modèles et contrôleurs seront toujours adéquats peu importe la plateforme cible.

Compilation conditionnelle

Les vues sont peu impliquées dans l’approche traditionnelle de partage de code, mais la mise en œuvre reste tout de même possible en s’inspirant de quelques techniques utilisées par Apple dans des applications telles que Keynote. Notre application iOS existante utilisera l’espace de noms UIKit, qui est le Framework qui fournit l’architecture de la fenêtre et de la vue dont nous avons besoin pour gérer l’interface utilisateur de nos applications. C’est là que vous retrouverez des boutons, labels, couleurs et autres classes permettant de construire l’interface utilisateur des applications. UIKit est disponible uniquement pour iOS, ce qui signifie que la réutilisation du code de ce Framework sur Mac ne pourrait se faire sans certaines modifications.
Supposons que nous voulons partager des couleurs entre les différentes plateformes.

iOS

var xamarinBlue = UIColor.FromRGB(0.26f, 0.83f, 0.31f);

Mac

var xamarinBlue = NSColor.FromCalibratedRgba(0.26f, 0.83f, 0.31f, 1f);

Les deux extraits de code ci-dessus représentent une assignation d’une même couleur dans chacune des deux plateformes. Grâce à la compilation conditionnelle (ou « Shimming » selon le jargon de Apple), nous pouvons partager cette assignation de couleur entre les deux plateformes.

public class Color
{
#if __MAC__

public static NSColor FromRGB(nfloat r, nfloat g, nfloat b)
{
return NSColor.FromCalibratedRgba(r, g, b, 1f);
}

#endif

#if __IOS__

public static UIColor FromRGB(nfloat r, nfloat g, nfloat b)
{
return UIColor.FromRGB(r,g,b);
}
#endif
}

À présent, nous pouvons utiliser le code suivant pour créer notre couleur dans nos deux applications iOS et OS X.

var xamarinBlue = Color.FromRGB(0.26f, 0.83f, 0.31f);

Lorsque ceci tournera sur iOS, il retournera UIColor et sur OS X nous aurons NSColor.
Nous pouvons utiliser cette approche dans plusieurs aspects de UIKit et AppKit.
Nous pouvons par exemple étendre cela sur UIImage et NSImage.

public static CGImage ToCGImage(string imageName)
{
#if __MAC__
return NSImage.ImageNamed(imageName).CGImage;
#endif
#if __IOS__
return UIImage.FromFile(imageName).CGImage;
#endif
}

 

Partage de l’Interface Utilisateur avec CALayers

Si vous désirez maximiser le partage de code, vous devriez considérer l’utilisation de CALayers. Les UIViews sont construits sur des CALayers, qui peuvent être accédé en utilisant la propriété Layer de l’UIView. L’avantage d’utiliser les CALayers au détriment des UIViews est que les CALayers peuvent être facilement portés sur OS X et il n’y a aucune perte de performance sur l’utilisation des UIViews ou NSViews. Pour exemple, le canvas de l’application Keynote de Apple utilise des CALayers, qui lui permettent de maximiser le partage de code entre iOS et OS X.
Dans l’exemple ci-dessous, la classe ColorChanger hérite de CALayer et réécrit la méthode DrawInContext pour récupérer le réglage de la vue. La couleur du background est définie en utilisant notre précédente méthode de compilation conditionnelle. Nous réécrivons aussi le HitTest, qui permet de répondre aux événements de Click et Touch. Dans cet extrait de code, nous désirons modifier la couleur de background de la couche à chaque fois que l’utilisateur interagit avec. Bien que ce soit un exemple basique, ce code fonctionne bien à la fois avec iOS et OS X sans aucune modification.

public class ColorChanger : CALayer
{
 public override void DrawInContext(CGContext ctx)
 {
   base.DrawInContext(ctx);
   BackgroundColor = Color.FromRGB(0.65f, 0.22f, 0.72f).CGColor;
   count = 0;
 
   this.Contents = Image.ToCGImage("xamagon.png");
 }
 
 public override CALayer HitTest(CGPoint p)
 {
   switch (count)
   {
     case 0:
       BackgroundColor = BackgroundColor = Color.FromRGB(0.2f, 0.52f, 0.89f).CGColor;
       count++;
       break;
     case 1:
       BackgroundColor = BackgroundColor = Color.FromRGB(0.26f, 0.83f, 0.31f).CGColor;
       count++;
       break;
     case 2:
       BackgroundColor = BackgroundColor = Color.FromRGB(0.65f, 0.22f, 0.72f).CGColor;
       count = 0;
       break;
  }
  return base.HitTest(p);
 }
 
 int count = 0;
}


Conclusion

Xamarin offre des possibilités immenses de partage de code entre les différentes plateformes et avec un peu de vigilance couplé de quelques astuces comme celles proposées dans ce billet, vous pouvez aller au-delà des stratégies de partage traditionnellement proposeés.

profile

Christian Hissibini

I am a Tech enthusiast who loves to blend Dev & Design on Web and Mobile Platforms. I am also a Windows Platform Dev MVP

There are no comments.

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

View Comments (0) ...
Navigation