Partager via


Utilisation des vues de collection tvOS dans Xamarin

Les vues de collection permettent d’afficher un groupe de contenu à l’aide de dispositions arbitraires. À l’aide de la prise en charge intégrée, ils permettent de créer facilement des dispositions linéaires ou similaires à la grille, tout en prenant en charge les dispositions personnalisées.

Exemple de vue de collection

La vue Collection gère une collection d’éléments à l’aide d’un délégué et d’une source de données pour fournir une interaction utilisateur et le contenu de la collection. Étant donné que l’affichage collection est basé sur un sous-système de disposition indépendant de la vue elle-même, la fourniture d’une autre disposition peut facilement modifier la présentation des données de la vue collection à la volée.

À propos des vues de collection

Comme indiqué ci-dessus, un affichage collection (UICollectionView) gère une collection ordonnée d’éléments et présente ces éléments avec des dispositions personnalisables. Les vues de collection fonctionnent de la même manière que les vues de table (UITableView), sauf qu’elles peuvent utiliser des dispositions pour présenter des éléments en plus d’une seule colonne.

Lorsque vous utilisez une vue collection dans tvOS, votre application est chargée de fournir les données associées à la collection à l’aide d’une source de données (UICollectionViewDataSource). Les données de vue de collecte peuvent éventuellement être organisées et présentées dans différents groupes (sections).

Le mode Collection présente les éléments individuels à l’écran à l’aide d’une cellule (UICollectionViewCell) qui fournit la présentation d’une partie donnée d’informations de la collection (comme une image et son titre).

Si vous le souhaitez, les vues supplémentaires peuvent être ajoutées à la présentation de l’affichage collection pour agir en tant qu’en-tête et pied de page pour les sections et les cellules. La disposition de l’affichage collection est chargée de définir le positionnement de ces vues, ainsi que les cellules individuelles.

Le mode Collection peut répondre à l’interaction de l’utilisateur à l’aide d’un délégué (UICollectionViewDelegate). Ce délégué est également chargé de déterminer si une cellule donnée peut se concentrer, si une cellule a été mise en surbrillance ou si une cellule a été sélectionnée. Dans certains cas, le délégué détermine la taille des cellules individuelles.

Dispositions du mode Collection

Une fonctionnalité clé d’une vue de collection est sa séparation entre les données qu’il présente et sa disposition. Une disposition de vue collection (UICollectionViewLayout) est responsable de la fourniture de l’organisation et de l’emplacement des cellules (et de toutes les vues supplémentaires) dans la présentation à l’écran de l’affichage collection.

Les cellules individuelles sont créées par l’affichage collection à partir de sa source de données jointe, puis organisées et affichées par la disposition de la vue collection donnée.

La disposition du mode Collection est normalement fournie lors de la création de l’affichage collection. Toutefois, vous pouvez modifier la disposition du mode Collection à tout moment et la présentation à l’écran des données de la vue collection sera automatiquement mise à jour à l’aide de la nouvelle disposition fournie.

La disposition du mode Collection fournit plusieurs méthodes qui peuvent être utilisées pour animer la transition entre deux dispositions différentes (par défaut, aucune animation n’est effectuée). En outre, les dispositions du mode Collection peuvent fonctionner avec Les reconnaissances de mouvement pour animer davantage l’interaction utilisateur qui entraîne une modification de la disposition.

Création de cellules et de vues supplémentaires

La source de données d’une vue de collection est non seulement responsable de la fourniture des données qui sauvegardent l’élément de la collection, mais également des cellules utilisées pour afficher le contenu.

Étant donné que les vues de collection ont été conçues pour gérer de grandes collections d’éléments, les cellules individuelles peuvent être mise en file d’attente et réutilisées pour ne pas dépasser les limitations de mémoire. Il existe deux méthodes différentes pour la suppression des vues :

  • DequeueReusableCell - Crée ou retourne une cellule du type donné (comme spécifié dans le Storyboard de l’application).
  • DequeueReusableSupplementaryView - Crée ou retourne une vue supplémentaire du type donné (comme spécifié dans le Storyboard de l’application).

Avant d’appeler l’une de ces méthodes, vous devez inscrire la classe, storyboard ou .xib fichier utilisé pour créer la vue de la cellule avec l’affichage collection. Par exemple :

public CityCollectionView (IntPtr handle) : base (handle)
{
    // Initialize
    RegisterClassForCell (typeof(CityCollectionViewCell), CityViewDatasource.CardCellId);
    ...
}

typeof(CityCollectionViewCell) fournit la classe qui prend en charge la vue et CityViewDatasource.CardCellId fournit l’ID utilisé lorsque la cellule (ou la vue) est mise en file d’attente.

Une fois la cellule mise en file d’attente, vous la configurez avec les données de l’élément qu’elle représente et revenez à la vue collection pour l’affichage.

À propos des contrôleurs d’affichage de collection

Un contrôleur de vue de collection (UICollectionViewController) est un contrôleur de vue spécialisé (UIViewController) qui fournit le comportement suivant :

  • Il est responsable du chargement de l’affichage collection à partir de son storyboard ou .xib de son fichier et de l’instanciation de la vue. S’il est créé dans le code, il crée automatiquement une vue de collection non configurée.
  • Une fois l’affichage collection chargé, le contrôleur tente de charger sa source de données et de déléguer à partir du storyboard ou .xib du fichier. Si aucun n’est disponible, il se définit comme la source des deux.
  • Garantit que les données sont chargées avant que l’affichage de collection soit renseigné sur le premier affichage, puis recharge et efface la sélection sur chaque affichage suivant.

En outre, le contrôleur de vue collection fournit des méthodes substituables qui peuvent être utilisées pour gérer le cycle de vie de la vue collection, comme AwakeFromNib et ViewWillDisplay.

Vues de collection et storyboards

Le moyen le plus simple d’utiliser une vue collection dans votre application Xamarin.tvOS consiste à en ajouter un à son Storyboard. Par exemple, nous allons créer un exemple d’application qui présente une image, un titre et un bouton de sélection. Si l’utilisateur clique sur le bouton Sélectionner, un affichage collection s’affiche pour permettre à l’utilisateur de choisir une nouvelle image. Lorsqu’une image est choisie, le mode Collection est fermé et la nouvelle image et le nouveau titre sont affichés.

Procédons comme suit :

  1. Démarrez une nouvelle application tvOS à affichage unique dans Visual Studio pour Mac.

  2. Dans le Explorateur de solutions, double-cliquez sur le Main.storyboard fichier et ouvrez-le dans le Concepteur iOS.

  3. Ajoutez un affichage image, une étiquette et un bouton à l’affichage existant et configurez-les comme suit :

    Exemple de disposition

  4. Attribuez un nom à l’affichage image et à l’étiquette dans l’onglet Widget de l’Explorateur de propriétés. Par exemple :

    Définition du nom

  5. Ensuite, faites glisser un contrôleur d’affichage de collection sur le storyboard :

    Contrôleur d’affichage de collection

  6. Faites glisser le contrôle du bouton vers le contrôleur d’affichage de collection et sélectionnez Push dans la fenêtre contextuelle :

    Sélectionner Envoyer (Push) dans la fenêtre contextuelle

  7. Lorsque l’application est exécutée, l’affichage collection s’affiche chaque fois que l’utilisateur clique sur le bouton.

  8. Sélectionnez l’affichage collection et entrez les valeurs suivantes dans l’onglet Disposition de l’Explorateur de propriétés :

    Explorateur de propriétés

  9. Cela contrôle la taille des cellules individuelles et les bordures entre les cellules et le bord externe de la vue collection.

  10. Sélectionnez le contrôleur d’affichage de collection et définissez sa classe CityCollectionViewController dans l’onglet Widget :

    Définir la classe sur CityCollectionViewController

  11. Sélectionnez l’affichage collection et définissez sa classe CityCollectionView dans l’onglet Widget :

    Définir la classe sur CityCollectionView

  12. Sélectionnez la cellule Vue collection et définissez sa classe CityCollectionViewCell dans l’onglet Widget :

    Définir la classe sur CityCollectionViewCell

  13. Dans l’ongletWidget, vérifiez que la disposition est Flow et que la direction du défilement est Vertical pour l’affichage collection :

    Onglet Widget

  14. Sélectionnez la cellule Vue collection et définissez son identité CityCell dans l’onglet Widget :

    Définir l’identité sur CityCell

  15. Enregistrez vos modifications.

Si nous avions choisi Custom la disposition du mode Collection, nous aurions pu spécifier une disposition personnalisée. Apple fournit une version intégrée et UICollectionViewDelegateFlowLayout qui peut facilement présenter des données dans une disposition basée sur la grille (celles-ci UICollectionViewFlowLayout sont utilisées par le flow style de disposition).

Pour plus d’informations sur l’utilisation de Storyboards, consultez notre Guide de démarrage rapide Hello, tvOS.

Fourniture de données pour la vue collection

Maintenant que nous avons ajouté notre vue collection (et le contrôleur de vue de collection) à notre Storyboard, nous devons fournir les données de la collection.

Modèle de données

Tout d’abord, nous allons créer un modèle pour nos données qui contiennent le nom de fichier de l’image à afficher, le titre et un indicateur pour permettre à la ville d’être sélectionnée.

Créez une CityInfo classe et faites-la ressembler à ce qui suit :

using System;

namespace tvCollection
{
    public class CityInfo
    {
        #region Computed Properties
        public string ImageFilename { get; set; }
        public string Title { get; set; }
        public bool CanSelect{ get; set; }
        #endregion

        #region Constructors
        public CityInfo (string filename, string title, bool canSelect)
        {
            // Initialize
            this.ImageFilename = filename;
            this.Title = title;
            this.CanSelect = canSelect;
        }
        #endregion
    }
}

Cellule Vue collection

Nous devons maintenant définir la façon dont les données seront présentées pour chaque cellule. Modifiez le CityCollectionViewCell.cs fichier (créé automatiquement à partir de votre fichier Storyboard) et faites-le ressembler à ce qui suit :

using System;
using Foundation;
using UIKit;
using CoreGraphics;

namespace tvCollection
{
    public partial class CityCollectionViewCell : UICollectionViewCell
    {
        #region Private Variables
        private CityInfo _city;
        #endregion

        #region Computed Properties
        public UIImageView CityView { get ; set; }
        public UILabel CityTitle { get; set; }

        public CityInfo City {
            get { return _city; }
            set {
                _city = value;
                CityView.Image = UIImage.FromFile (City.ImageFilename);
                CityView.Alpha = (City.CanSelect) ? 1.0f : 0.5f;
                CityTitle.Text = City.Title;
            }
        }
        #endregion

        #region Constructors
        public CityCollectionViewCell (IntPtr handle) : base (handle)
        {
            // Initialize
            CityView = new UIImageView(new CGRect(22, 19, 320, 171));
            CityView.AdjustsImageWhenAncestorFocused = true;
            AddSubview (CityView);

            CityTitle = new UILabel (new CGRect (22, 209, 320, 21)) {
                TextAlignment = UITextAlignment.Center,
                TextColor = UIColor.White,
                Alpha = 0.0f
            };
            AddSubview (CityTitle);
        }
        #endregion


    }
}

Pour notre application tvOS, nous affichons une image et un titre facultatif. Si la ville donnée ne peut pas être sélectionnée, nous grisons la vue d’image à l’aide du code suivant :

CityView.Alpha = (City.CanSelect) ? 1.0f : 0.5f;

Lorsque la cellule contenant l’image est mise au focus par l’utilisateur, nous voulons utiliser l’effet Parallax intégré sur celui-ci pour définir la propriété suivante :

CityView.AdjustsImageWhenAncestorFocused = true;

Pour plus d’informations sur la navigation et le focus, consultez notre documentation sur l’utilisation de la navigation et du focus et des contrôleurs Bluetooth et Siri.

Vue collection Fournisseur de données

Avec notre modèle de données créé et notre disposition de cellule définie, nous allons créer une source de données pour notre vue de collection. La source de données sera chargée non seulement de fournir les données de stockage, mais également de mettre en file d’attente les cellules pour afficher les cellules individuelles à l’écran.

Créez une CityViewDatasource classe et faites-la ressembler à ce qui suit :

using System;
using System.Collections.Generic;
using UIKit;
using Foundation;
using CoreGraphics;
using ObjCRuntime;

namespace tvCollection
{
    public class CityViewDatasource : UICollectionViewDataSource
    {
        #region Application Access
        public static AppDelegate App {
            get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
        }
        #endregion

        #region Static Constants
        public static NSString CardCellId = new NSString ("CityCell");
        #endregion

        #region Computed Properties
        public List<CityInfo> Cities { get; set; } = new List<CityInfo>();
        public CityCollectionView ViewController { get; set; }
        #endregion

        #region Constructors
        public CityViewDatasource (CityCollectionView controller)
        {
            // Initialize
            this.ViewController = controller;
            PopulateCities ();
        }
        #endregion

        #region Public Methods
        public void PopulateCities() {

            // Clear existing cities
            Cities.Clear();

            // Add new cities
            Cities.Add(new CityInfo("City01.jpg", "Houses by Water", false));
            Cities.Add(new CityInfo("City02.jpg", "Turning Circle", true));
            Cities.Add(new CityInfo("City03.jpg", "Skyline at Night", true));
            Cities.Add(new CityInfo("City04.jpg", "Golden Gate Bridge", true));
            Cities.Add(new CityInfo("City05.jpg", "Roads by Night", true));
            Cities.Add(new CityInfo("City06.jpg", "Church Domes", true));
            Cities.Add(new CityInfo("City07.jpg", "Mountain Lights", true));
            Cities.Add(new CityInfo("City08.jpg", "City Scene", false));
            Cities.Add(new CityInfo("City09.jpg", "House in Winter", true));
            Cities.Add(new CityInfo("City10.jpg", "By the Lake", true));
            Cities.Add(new CityInfo("City11.jpg", "At the Dome", true));
            Cities.Add(new CityInfo("City12.jpg", "Cityscape", true));
            Cities.Add(new CityInfo("City13.jpg", "Model City", true));
            Cities.Add(new CityInfo("City14.jpg", "Taxi, Taxi!", true));
            Cities.Add(new CityInfo("City15.jpg", "On the Sidewalk", true));
            Cities.Add(new CityInfo("City16.jpg", "Midnight Walk", true));
            Cities.Add(new CityInfo("City17.jpg", "Lunchtime Cafe", true));
            Cities.Add(new CityInfo("City18.jpg", "Coffee Shop", true));
            Cities.Add(new CityInfo("City19.jpg", "Rustic Tavern", true));
        }
        #endregion

        #region Override Methods
        public override nint NumberOfSections (UICollectionView collectionView)
        {
            return 1;
        }

        public override nint GetItemsCount (UICollectionView collectionView, nint section)
        {
            return Cities.Count;
        }

        public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
        {
            var cityCell = (CityCollectionViewCell)collectionView.DequeueReusableCell (CardCellId, indexPath);
            var city = Cities [indexPath.Row];

            // Initialize city
            cityCell.City = city;

            return cityCell;
        }
        #endregion
    }
}

Examinons cette classe en détail. Tout d’abord, nous hériterons et UICollectionViewDataSource fournissons un raccourci vers l’ID de cellule (que nous avons affecté dans le Concepteur iOS) :

public static NSString CardCellId = new NSString ("CityCell");

Nous fournissons ensuite le stockage de nos données de collecte et fournissons une classe pour remplir les données :

public List<CityInfo> Cities { get; set; } = new List<CityInfo>();
...

public void PopulateCities() {

    // Clear existing cities
    Cities.Clear();

    // Add new cities
    Cities.Add(new CityInfo("City01.jpg", "Houses by Water", false));
    Cities.Add(new CityInfo("City02.jpg", "Turning Circle", true));
    ...
}

Ensuite, nous substituons la NumberOfSections méthode et renvoyons le nombre de sections (groupes d’éléments) dont dispose l’affichage collection. Dans ce cas, il n’existe qu’un seul :

public override nint NumberOfSections (UICollectionView collectionView)
{
    return 1;
}

Ensuite, nous renvoyons le nombre d’éléments de notre collection à l’aide du code suivant :

public override nint GetItemsCount (UICollectionView collectionView, nint section)
{
    return Cities.Count;
}

Enfin, nous déconseilons une cellule réutilisable lorsque la demande De vue collection avec le code suivant :

public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
    var cityCell = (CityCollectionViewCell)collectionView.DequeueReusableCell (CardCellId, indexPath);
    var city = Cities [indexPath.Row];

    // Initialize city
    cityCell.City = city;

    return cityCell;
}

Une fois que nous avons obtenu une cellule d’affichage de collection de notre CityCollectionViewCell type, nous l’avons renseignée avec l’élément donné.

Réponse aux événements utilisateur

Étant donné que nous voulons que l’utilisateur puisse sélectionner un élément dans notre collection, nous devons fournir un délégué de vue collection pour gérer cette interaction. Et nous devons fournir un moyen de permettre à notre affichage appelant de savoir quel élément l’utilisateur a sélectionné.

Délégué d’application

Nous avons besoin d’un moyen de lier l’élément actuellement sélectionné à partir de l’affichage collection à l’affichage appelant. Nous allons utiliser une propriété personnalisée sur notre AppDelegate. Modifiez le AppDelegate.cs fichier et ajoutez le code suivant :

public CityInfo SelectedCity { get; set;} = new CityInfo("City02.jpg", "Turning Circle", true);

Cela définit la propriété et définit la ville par défaut qui sera initialement affichée. Plus tard, nous utiliserons cette propriété pour afficher la sélection de l’utilisateur et autoriser la modification de la sélection.

Délégué de l’affichage collection

Ensuite, ajoutez une nouvelle CityViewDelegate classe au projet et faites-la ressembler à ce qui suit :

using System;
using System.Collections.Generic;
using UIKit;
using Foundation;
using CoreGraphics;

namespace tvCollection
{
    public class CityViewDelegate : UICollectionViewDelegateFlowLayout
    {
        #region Application Access
        public static AppDelegate App {
            get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
        }
        #endregion

        #region Constructors
        public CityViewDelegate ()
        {
        }
        #endregion

        #region Override Methods
        public override CGSize GetSizeForItem (UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath)
        {
            return new CGSize (361, 256);
        }

        public override bool CanFocusItem (UICollectionView collectionView, NSIndexPath indexPath)
        {
            if (indexPath == null) {
                return false;
            } else {
                var controller = collectionView as CityCollectionView;
                return controller.Source.Cities[indexPath.Row].CanSelect;
            }
        }

        public override void ItemSelected (UICollectionView collectionView, NSIndexPath indexPath)
        {
            var controller = collectionView as CityCollectionView;
            App.SelectedCity = controller.Source.Cities [indexPath.Row];

            // Close Collection
            controller.ParentController.DismissViewController(true,null);
        }
        #endregion
    }
}

Examinons de plus près cette classe. Tout d’abord, nous hériterons de UICollectionViewDelegateFlowLayout. La raison pour laquelle nous héritez de cette classe et non que UICollectionViewDelegate nous utilisons le composant UICollectionViewFlowLayout intégré pour présenter nos éléments et non un type de disposition personnalisé.

Ensuite, nous renvoyons la taille des éléments individuels à l’aide de ce code :

public override CGSize GetSizeForItem (UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath)
{
    return new CGSize (361, 256);
}

Ensuite, nous décidons si une cellule donnée peut se concentrer à l’aide du code suivant :

public override bool CanFocusItem (UICollectionView collectionView, NSIndexPath indexPath)
{
    if (indexPath == null) {
        return false;
    } else {
        var controller = collectionView as CityCollectionView;
        return controller.Source.Cities[indexPath.Row].CanSelect;
    }
}

Nous case activée de voir si un élément donné de données de stockage a son CanSelect indicateur défini true sur et retourne cette valeur. Pour plus d’informations sur la navigation et le focus, consultez notre documentation sur l’utilisation de la navigation et du focus et des contrôleurs Bluetooth et Siri.

Enfin, nous répondons à l’utilisateur en sélectionnant un élément avec le code suivant :

public override void ItemSelected (UICollectionView collectionView, NSIndexPath indexPath)
{
    var controller = collectionView as CityCollectionView;
    App.SelectedCity = controller.Source.Cities [indexPath.Row];

    // Close Collection
    controller.ParentController.DismissViewController(true,null);
}

Ici, nous définissons la SelectedCity propriété de notre AppDelegate sur l’élément sélectionné par l’utilisateur et nous fermons le contrôleur de vue collection, en retournant à la vue qui nous a appelé. Nous n’avons pas encore défini la ParentController propriété de notre vue collection.

Configuration de l’affichage collection

Nous devons maintenant modifier notre vue de collecte et affecter notre source de données et notre délégué. Modifiez le CityCollectionView.cs fichier (créé automatiquement à partir de notre Storyboard) et faites-le ressembler à ce qui suit :

using System;
using Foundation;
using UIKit;

namespace tvCollection
{
    public partial class CityCollectionView : UICollectionView
    {
        #region Application Access
        public static AppDelegate App {
            get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
        }
        #endregion

        #region Computed Properties
        public CityViewDatasource Source {
            get { return DataSource as CityViewDatasource;}
        }

        public CityCollectionViewController ParentController { get; set;}
        #endregion

        #region Constructors
        public CityCollectionView (IntPtr handle) : base (handle)
        {
            // Initialize
            RegisterClassForCell (typeof(CityCollectionViewCell), CityViewDatasource.CardCellId);
            DataSource = new CityViewDatasource (this);
            Delegate = new CityViewDelegate ();
        }
        #endregion

        #region Override Methods
        public override nint NumberOfSections ()
        {
            return 1;
        }

        public override void DidUpdateFocus (UIFocusUpdateContext context, UIFocusAnimationCoordinator coordinator)
        {
            var previousItem = context.PreviouslyFocusedView as CityCollectionViewCell;
            if (previousItem != null) {
                Animate (0.2, () => {
                    previousItem.CityTitle.Alpha = 0.0f;
                });
            }

            var nextItem = context.NextFocusedView as CityCollectionViewCell;
            if (nextItem != null) {
                Animate (0.2, () => {
                    nextItem.CityTitle.Alpha = 1.0f;
                });
            }
        }
        #endregion
    }
}

Tout d’abord, nous fournissons un raccourci pour accéder à notre AppDelegate:

public static AppDelegate App {
    get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
}

Ensuite, nous fournissons un raccourci vers la source de données de la vue collection et une propriété pour accéder au contrôleur de vue collection (utilisé par notre délégué ci-dessus pour fermer la collection lorsque l’utilisateur effectue une sélection) :

public CityViewDatasource Source {
    get { return DataSource as CityViewDatasource;}
}

public CityCollectionViewController ParentController { get; set;}

Ensuite, nous utilisons le code suivant pour initialiser la vue collection et affecter notre classe de cellules, la source de données et le délégué :

public CityCollectionView (IntPtr handle) : base (handle)
{
    // Initialize
    RegisterClassForCell (typeof(CityCollectionViewCell), CityViewDatasource.CardCellId);
    DataSource = new CityViewDatasource (this);
    Delegate = new CityViewDelegate ();
}

Enfin, nous voulons que le titre sous l’image soit visible uniquement lorsque l’utilisateur l’a mis en surbrillance (en focus). Nous procédons ainsi avec le code suivant :

public override void DidUpdateFocus (UIFocusUpdateContext context, UIFocusAnimationCoordinator coordinator)
{
    var previousItem = context.PreviouslyFocusedView as CityCollectionViewCell;
    if (previousItem != null) {
        Animate (0.2, () => {
            previousItem.CityTitle.Alpha = 0.0f;
        });
    }

    var nextItem = context.NextFocusedView as CityCollectionViewCell;
    if (nextItem != null) {
        Animate (0.2, () => {
            nextItem.CityTitle.Alpha = 1.0f;
        });
    }
}

Nous définissons la transparence de l’élément précédent perdant le focus sur zéro (0) et la transparence de l’élément suivant gagne le focus sur 100 %. Ces transitions sont également animées.

Configuration du contrôleur d’affichage de collection

Maintenant, nous devons effectuer la configuration finale sur notre vue collection et autoriser le contrôleur à définir la propriété que nous avons définie afin que la vue de collection puisse être fermée une fois que l’utilisateur a effectué une sélection.

Modifiez le CityCollectionViewController.cs fichier (créé automatiquement à partir de notre Storyboard) et faites-le ressembler à ce qui suit :

// This file has been autogenerated from a class added in the UI designer.

using System;

using Foundation;
using UIKit;

namespace tvCollection
{
    public partial class CityCollectionViewController : UICollectionViewController
    {
        #region Computed Properties
        public CityCollectionView Collection {
            get { return CollectionView as CityCollectionView; }
        }
        #endregion

        #region Constructors
        public CityCollectionViewController (IntPtr handle) : base (handle)
        {
        }
        #endregion

        #region Override Methods
        public override void AwakeFromNib ()
        {
            base.AwakeFromNib ();

            // Save link to controller
            Collection.ParentController = this;
        }
        #endregion
    }
}

En résumé

Maintenant que toutes les parties sont regroupées pour remplir et contrôler notre vue de collection, nous devons apporter les modifications finales à notre vue principale pour rassembler tous les éléments.

Modifiez le ViewController.cs fichier (créé automatiquement à partir de notre Storyboard) et faites-le ressembler à ce qui suit :

using System;
using Foundation;
using UIKit;
using tvCollection;

namespace MySingleView
{
    public partial class ViewController : UIViewController
    {
        #region Application Access
        public static AppDelegate App {
            get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
        }
        #endregion

        #region Constructors
        public ViewController (IntPtr handle) : base (handle)
        {
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();
            // Perform any additional setup after loading the view, typically from a nib.
        }

        public override void ViewWillAppear (bool animated)
        {
            base.ViewWillAppear (animated);

            // Update image with the currently selected one
            CityView.Image = UIImage.FromFile(App.SelectedCity.ImageFilename);
            BackgroundView.Image = CityView.Image;
            CityTitle.Text = App.SelectedCity.Title;
        }

        public override void DidReceiveMemoryWarning ()
        {
            base.DidReceiveMemoryWarning ();
            // Release any cached data, images, etc that aren't in use.
        }
        #endregion
    }
}

Le code suivant affiche initialement l’élément sélectionné à partir de la propriété du AppDelegate fichier et le réaffiche lorsque l’utilisateur a effectué une sélection à partir de l’affichage SelectedCity collection :

public override void ViewWillAppear (bool animated)
{
    base.ViewWillAppear (animated);

    // Update image with the currently selected one
    CityView.Image = UIImage.FromFile(App.SelectedCity.ImageFilename);
    BackgroundView.Image = CityView.Image;
    CityTitle.Text = App.SelectedCity.Title;
}

Test de l’application

Avec tout ce qui est en place, si vous générez et exécutez l’application, la vue principale s’affiche avec la ville par défaut :

L’écran principal

Si l’utilisateur clique sur le bouton Sélectionner un affichage , l’affichage collection s’affiche :

Vue collection

Toute ville dont la CanSelect propriété est définie false sera grisée et l’utilisateur ne pourra pas lui affecter le focus. Lorsque l’utilisateur met en surbrillance un élément (faites-le en focus) le titre est affiché et il peut utiliser l’effet parallaxe pour incliner l’image en 3D.

Lorsque l’utilisateur clique sur une image sélectionnée, l’affichage collection est fermé et l’affichage principal est réaffiché avec la nouvelle image :

Nouvelle image sur l’écran d’accueil

Création d’éléments de disposition et de réorganisation personnalisés

L’une des principales fonctionnalités de l’utilisation d’un affichage collection est la possibilité de créer des dispositions personnalisées. Étant donné que tvOS hérite d’iOS, le processus de création d’une disposition personnalisée est le même. Pour plus d’informations, consultez notre documentation Présentation des vues de collection.

Récemment ajouté aux vues de collection pour iOS 9, la possibilité d’autoriser facilement la réorganisation des éléments dans la collection. Là encore, étant donné que tvOS 9 est un sous-ensemble d’iOS 9, cela est fait de la même façon. Pour plus d’informations, consultez le document Modifications de l’affichage collection.

Résumé

Cet article a abordé la conception et l’utilisation des vues de collection à l’intérieur d’une application Xamarin.tvOS. Tout d’abord, il a abordé tous les éléments qui composent le mode Collection. Ensuite, il a montré comment concevoir et implémenter un affichage collection à l’aide d’un storyboard. Enfin, vous trouverez des liens vers des informations sur la création de dispositions personnalisées et la réorganisation d’éléments.