NSMatrix et image

mac_manumac_manu Membre
07:46 modifié dans API AppKit #1
Hello la compagnie,

J'aimerais faire une vue pour afficher des images à  la façon de iPhoto. Pour cela, j'utilise une NSMatrix avec des NSCell. Pour afficher une image, pas de problème. Où ça se corse, c'est au redimensionnement de la fenêtre. Si j'ai réussi à  faire que les différentes cells varient de taille proportionnellement avec la fenêtre, il n'en va pas de même avec les images contenues; elles restent de même grandeur, alors que j'aimerais qu'elles s'adaptent à  la cell correspondante. Quelle fonction ou quelle propriété dois-je utiliser? Merci

Réponses

  • Eddy58Eddy58 Membre
    07:46 modifié #2
    Lorsque tu crées ta matrice, tu utilises bien une NSImageCell comme prototype (si tu crées ta matrice par code) ? :o
  • mac_manumac_manu Membre
    07:46 modifié #3
    En fait, non. J'utilise une NSCell... et je crée la matrice par code. NSImageCell serait plus approprié?
  • Eddy58Eddy58 Membre
    07:46 modifié #4
    Je pense oui, car elles sont réglées par défaut pour modifier proportionnellement la taille de ton image. :)
  • mac_manumac_manu Membre
    07:46 modifié #5
    Voilà , je viens d'essayer... sans succès.  :'(
    Mon code:
    NSImageCell *imageCell = [matrix* cellAtRow:0 column:0];  *outlet sur une NSMatrix
    [imageCell setImage:monImage];
    [imageCell setImageScaling:NSScaleTofit];

    Message d'erreur: NSActionCellsetImageScaling: selector not recognized.

    Petite question bête, faut-il que je sous-classe NSMatrix?
  • AliGatorAliGator Membre, Modérateur
    07:46 modifié #6
    Tu utilises [tt]setPrototype[/tt] ou [tt]setCellClass[/tt] de NSMatrix pour forcer tes cellules de NSMatrix à  être de type NSImageCell ? Ou tu le fais via IB ? Ou...?
  • Eddy58Eddy58 Membre
    07:46 modifié #7
    Le message d'erreur indique bien que ce ne sont pas des NSImageCell, et en effet il faut bien sous-classer ta matrice, et surcharger la méthode suivante comme ceci par exemple : :o

    [tt]
    -(id)initWithFrame:(NSRect)frameRect
    {
        [super initWithFrame:frameRect mode:NSRadioModeMatrix cellClass:[NSImageCell class] numberOfRows:5 numberOfColumns:5];
        return self;
    }
    [/tt]
  • BruBru Membre
    07:46 modifié #8
    dans 1145593746:

    Le message d'erreur indique bien que ce ne sont pas des NSImageCell, et en effet il faut bien sous-classer ta matrice, et surcharger la méthode suivante comme ceci par exemple : :o


    Pourquoi sous-classer NSMatrix, alors que la solution donnée par Aligator est justement faite pour éviter ça ?

    .
  • mac_manumac_manu Membre
    07:46 modifié #9
    Voilà  qui est mieux! <3 <br />Effectivement, il fallait sous-classer NSMatrix. Dernière question sur le sujet (j'espère), pour créer une vue "srollable", je peux, via l'outlet matrix, utiliser:
    [matrix setScrollable:YES]; ?
    Encore merci pour votre précieuse aide! ;)

    PS: Je viens de lire le dernier message. Je vais essayer d'utiliser la solution d'Aligator, en faisant:
    [matrix setCellClass:NSImageCell];
  • Eddy58Eddy58 Membre
    07:46 modifié #10
    dans 1145602338:

    Pourquoi sous-classer NSMatrix, alors que la solution donnée par Aligator est justement faite pour éviter ça ?

    Ces méthodes ne sont valables que pour la création de nouvelles cell, pas pour changer dynamiquement la classe des cells existantes. Donc tout se joue lors de l'initialisation de la matrice.


    pour créer une vue "srollable", je peux, via l'outlet matrix, utiliser: [matrix setScrollable:YES]; ?

    Cette méthode autorise ou non le scrolling à  l'intérieur de tes cells, par exemple si tes cells sont des texfields. Si c'est au niveau de la view de la matrice, il faut mettre ta matrice dans une NSScrollView. :)
  • BruBru Membre
    07:46 modifié #11
    dans 1145623181:

    dans 1145602338:

    Pourquoi sous-classer NSMatrix, alors que la solution donnée par Aligator est justement faite pour éviter ça ?

    Ces méthodes ne sont valables que pour la création de nouvelles cell, pas pour changer dynamiquement la classe des cells existantes. Donc tout se joue lors de l'initialisation de la matrice.


    Ce qui est son cas (et sans doute toujours le cas), non ?

    Dans IB, la création de la NSMatrix initiale est simple : déposer une NSImageView, et l'agrandir en appuyant la touche OPTION.
    On peut aussi utiliser l'inspecteur, définir la cellule prototype, et réappliquer ce prototype à  toutes les cellules existantes.

    Sinon, par programmation, il suffit simplement de réutiliser le code que tu sous-classes ([tt]initWithFrame:mode:cellClass:numberOfRows:numberOfColumns:[/tt]) pour créer la matrice initiale.

    De fait, tu me "choques" un peu en créant une sous-classe pour modifier un comportement qui a été prévu d'être modifiable dans la classe en question.

    .
  • Eddy58Eddy58 Membre
    07:46 modifié #12
    dans 1145624935:

    dans 1145623181:

    dans 1145602338:

    Pourquoi sous-classer NSMatrix, alors que la solution donnée par Aligator est justement faite pour éviter ça ?

    Ces méthodes ne sont valables que pour la création de nouvelles cell, pas pour changer dynamiquement la classe des cells existantes. Donc tout se joue lors de l'initialisation de la matrice.


    Ce qui est son cas (et sans doute toujours le cas), non ?

    Bien sûr, mais les méthodes setPrototype et setCellClass ne sont pas adaptées dans un tel cas contrairement à  ce que pourraient le laisser entendre les réactions plus haut.

    dans 1145624935:

    Sinon, par programmation, il suffit simplement de réutiliser le code que tu sous-classes ([tt]initWithFrame:mode:cellClass:numberOfRows:numberOfColumns:[/tt]) pour créer la matrice initiale.

    De fait, tu me "choques" un peu en créant une sous-classe pour modifier un comportement qui a été prévu d'être modifiable dans la classe en question.

    Tout à  fait...j'ai eu l'habitude jusqu'à  maintenant de n'utiliser que des matrices plutôt customisées, je me suis contenté de faire un copier/coller de mon code et de le modifier, de plus partant du principe que mac_manu crée sa matrice par code, je pensais qu'elle contenait des spécificitées, sinon pourquoi ne pas la faire simplement dans IB ? :o
Connectez-vous ou Inscrivez-vous pour répondre.