Problème d'affichage de NSView depuis MacOS 14.5

Bonjour
Une de mes applications MacOS me pose un problème :
Une NSView affiche des carrés de couleur et des lignes. Il y a 6 modes d'affichage différents.
Depuis MacOS 14.5, un des modes ne s'affiche plus mais les 5 autres oui. Mieux, le NSView répond correctement aux mouseDown dans ce mode alors que l'on ne voit pas les carrés de couleur : la NSView ne s'affiche pas, on ne voit que le gris-blanc de la fenêtre globale, mais elle fonctionne lorsqu'on clique dessus! Le code est appelé et exécuté (vérification par des NSLog).
J'ai lu des articles au sujet de la fonction clipsToBound. J'ai mis "self.clipsToBound = YES" pour voir, mais sans résultat. De toutes façons j'ai toujours utilisé "self.bounds" pour calculer la position des carrés. Et les autres modes fonctionnent normalement.
La NSView fait partie d'un synthé de musique, mais la classe son est totalement indépendante de la classe NSView (et elle fonctionne parfaitement)
D'où peut venir le problème selon vous?
je code encore en Objectiv-C, les premières versions du logiciel ont plus de dix ans)

Réponses

  • RocouRocou Membre

    Au cas où tu ne l'aurais pas fait, voici la réponse de ChatGPT4o :

    Le problème que tu décris semble être assez complexe et spécifique à la version 14.5 de MacOS. Voici quelques pistes pour tenter de diagnostiquer et résoudre ce problème :

    1. Vérifier le Drawing Code : Il est possible que le code de dessin pour ce mode particulier contienne des appels ou des configurations spécifiques qui ne sont plus compatibles avec MacOS 14.5. Assure-toi que tous les appels de dessin sont appropriés et que rien n'est obsolète.

    2. clipsToBounds : La propriété clipsToBounds est utile pour s'assurer que tout le contenu dessiné reste à l'intérieur des limites de la vue. Cependant, si self.clipsToBounds = YES n'a pas résolu le problème, cela signifie probablement que le problème se situe ailleurs. Néanmoins, assure-toi que toutes les vues subordonnées sont correctement configurées pour ne pas dépasser les limites de la vue parent.

    3. Layer-Backed Views : Si ta vue utilise des calques (CALayer), vérifie que les propriétés du calque sont correctement configurées. Parfois, des problèmes d'affichage peuvent survenir si les calques ne sont pas configurés correctement pour la nouvelle version de l'OS.

    4. Debugging avec Instruments et NSView : Utilise les outils de développement comme Instruments pour profiler l'application et vérifier si le rendu des vues est interrompu d'une manière ou d'une autre. Les logs de debug avec NSLog peuvent également aider à vérifier si certaines parties du code ne sont pas exécutées comme prévu.

    5. Compatibilité et Deprecation : Vérifie la documentation de MacOS 14.5 pour voir s'il y a des changements ou des dépréciations qui pourraient affecter ton code. Parfois, des fonctions ou des comportements peuvent être modifiés dans les nouvelles versions de l'OS.

    6. Tests de Dessin Simplifiés : Simplifie temporairement le code de dessin de ce mode pour voir si un dessin minimaliste fonctionne. Par exemple, essaie juste de dessiner un simple rectangle ou une ligne pour voir si cela s'affiche correctement.

    7. Coordonnées et Transformations : Assure-toi que les coordonnées et transformations utilisées pour dessiner les carrés sont correctes. Un changement dans le système de coordonnées pourrait être à l'origine du problème d'affichage.

    Voici un exemple de vérification de base pour le code de dessin en Objective-C :

    - (void)drawRect:(NSRect)dirtyRect {
        [super drawRect:dirtyRect];
    
        if (self.currentMode == MonModeSpecifique) {
            // Exemple simple de dessin
            [[NSColor redColor] setFill];
            NSRectFill(NSMakeRect(10, 10, 100, 100));
        } else {
            // Dessin des autres modes
            [self drawOtherModes];
        }
    }
    
    1. Layer-backed View Propriétés : Si tu utilises des calques, assure-toi qu'ils sont configurés correctement. Voici un exemple de configuration d'un calque :
    - (instancetype)initWithFrame:(NSRect)frameRect {
        self = [super initWithFrame:frameRect];
        if (self) {
            self.wantsLayer = YES;
            self.layer = [CALayer layer];
            self.layer.contentsScale = [NSScreen mainScreen].backingScaleFactor;
        }
        return self;
    }
    

    Si après toutes ces vérifications le problème persiste, il pourrait être utile de consulter les forums de développeurs Apple ou de soumettre un ticket auprès du support technique Apple pour voir si d'autres développeurs ont rencontré un problème similaire avec MacOS 14.5.

  • HerveHerve Membre

    Merci, je regarde tout ça. Je vous tiens au courant.

  • HerveHerve Membre
    26 mai modifié #4

    Je viens de modifier ceci : j'avais laissé un "vieil" NSAlert dans cette NSView, mais dans une autre fonction que celle du dessin. (J'avais déjà remplacé tous les autres il y a longtemps mais avais oublié celui-là) J'ai remplacé le code par le nouveau de type :
    NSAlert *alert = [[NSAlert alloc] init]; [alert addButtonWithTitle:@"OK"]; [alert setInformativeText:@"...."];

    Apparemment le bug a disparu. L'affichage est redevenu normal.
    Merci Rocou!

  • HerveHerve Membre

    J'ai parlé un peu vite... Le problème est revenu!! Je cherche encore

  • CéroceCéroce Membre, Modérateur

    C'est difficile de répondre sans voir de code.
    Que fais-tu de particulier dans ce mode? Utiliserais-tu une couleur "système" ?

  • HerveHerve Membre
    30 mai modifié #7

    Merci Céroce pour ton message. Depuis le début tu m'aides beaucoup à créer ce synthétiseur inhabituel, et je t'en remercie.

    Voici le code qui pose problème : les points couleur sur le NSView correspondent à des timbres dans le moteur audio. Ceux-ci sont parfaitement joués bien que le NSView ne s'affiche pas du tout. (les deux moteurs sont indépendants de toute façon, c'est normal).

    Un coup le code fonctionne, un coup non.

    Je ne voulais pas vous infliger ceci mais bon (en sachant que le code est appelé, que les vérifications NSLog sont OK, etc.)

    else if (typePatch == 6){    //mode MPE
    
            //NSLog(@"Appel drawRect MPE, typePatch = %d", typePatch);
    
            int divAlpha = 4.0;
            taillePoint = NSMakeSize(self.bounds.size.width/30.0, self.bounds.size.height/30.0);
    
            float distKey = cadre.size.height/30.0;
            float distLarge = (cadre.size.width/50);
            float ligneA[12];
            float ligneB[18];
            float posValuesB[] = {3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0};
            for (int i = 0; i < 18;i++)ligneB[i] = posValuesB[i] * distKey;
    
            float posValues[] = {3.0, 4.0, 6.0, 7.0, 12.0, 13.0, 15.0, 16.0, 21.0, 22.0, 24.0, 25.0};
            for (int i = 0; i < 12;i++)ligneA[i] = posValues[i] * distKey;
    
            //dessin des points de couleur, une classe couleur stocke les valeurs HSB. Fonctionne TB avec les autres modes
    
            //NSLog(@"nombre de lignes = %lu",[lesLignes count]);   //OK, le code est appelé
            //si les lignes existent, elles sont dessinées. On crée un dégradé de couleurs à partir des couleurs existantes, qui correspondent à des timbres musicaux.
    
            if ([lesLignes count] > 0 && [[boiteBoutonsCouleur lesCouleurs]count] > 0){
                for (int i = 0; i < 12; i++){
                    for (int j = 0; j < [lesLignes count]; j++){
                        //si égalité d'indexNote
    
                        if (i == [[lesLignes objectAtIndex:j]indexNote]){
                            //NSLog(@"ligne %d (indexNote) sélectionnée pour dessin MPE", i);   //appelé
                            NSMutableArray *couleursDeLaLigne = [[NSMutableArray alloc]init];
                            for (int p = 0; p < [[[lesLignes objectAtIndex:j]lesPoints]count]; p++){
                                int indexC = [[[[lesLignes objectAtIndex:j]lesPoints]objectAtIndex:p]indexCouleur];
                                CouleurSon *oCouleurSon = [[[boiteBoutonsCouleur lesCouleurs]objectAtIndex:indexC]laCouleurSon];
                                NSColor *couleurDuPoint = [NSColor colorWithCalibratedHue:[oCouleurSon hueVal]
                                                                               saturation:[oCouleurSon satVal] brightness:[oCouleurSon brightVal] alpha:([oCouleurSon transpVal]/divAlpha)];
                                [couleursDeLaLigne addObject:couleurDuPoint];
                            }
                            for (int k = 0; k < 50; k++){
                                if ((k*distLarge)<=[[[[lesLignes objectAtIndex:j]lesPoints]objectAtIndex:0]posX]){
                                float distP0 = [[[[lesLignes objectAtIndex:j]lesPoints]objectAtIndex:0]posX];
                                    NSColor *couleurRect = [NSColor colorWithCalibratedRed: [[couleursDeLaLigne objectAtIndex:0]redComponent] green: [[couleursDeLaLigne objectAtIndex:0]greenComponent] blue:
                                    [[couleursDeLaLigne objectAtIndex:0]blueComponent] alpha: ([[couleursDeLaLigne objectAtIndex:0]alphaComponent]*(k*distLarge/distP0))];
                                    NSRect pointC = NSMakeRect((k*distLarge), ligneA[i], distLarge, distKey);
                                    [couleurRect set];
                                    [NSBezierPath fillRect:pointC];
                               }//fin if avant premier point
                                else if ((k*distLarge)>[[[[lesLignes objectAtIndex:j]lesPoints]lastObject]posX]){
                                    NSColor *couleurRect = [NSColor colorWithCalibratedRed: [[couleursDeLaLigne lastObject]redComponent] green: [[couleursDeLaLigne lastObject]greenComponent] blue: [[couleursDeLaLigne lastObject]blueComponent] alpha:  [[couleursDeLaLigne lastObject]alphaComponent]];
                                    NSRect pointC= NSMakeRect((k*distLarge), ligneA[i], distLarge, distKey);
                                    [couleurRect set];
                                    [NSBezierPath fillRect:pointC];
                                }//fin si après dernier point
                                else{
                                    for (int q = 0; q < ([couleursDeLaLigne count]-1); q++){
                                        if (((k*distLarge)>[[[[lesLignes objectAtIndex:j]lesPoints]objectAtIndex:q]posX])
                                           && ((k*distLarge)<=[[[[lesLignes objectAtIndex:j]lesPoints]objectAtIndex:(q+1)]posX])){
                                           float dist2P = [[[[lesLignes objectAtIndex:j]lesPoints]objectAtIndex:(q+1)]posX] - [[[[lesLignes objectAtIndex:j]lesPoints]objectAtIndex:q]posX];
                                            float distPA = (k*distLarge) - [[[[lesLignes objectAtIndex:j]lesPoints]objectAtIndex:q]posX];
                                            float distPB = [[[[lesLignes objectAtIndex:j]lesPoints]objectAtIndex:(q+1)]posX] - (k*distLarge);
                                            NSColor *couleurRect = [NSColor colorWithCalibratedRed:  ((([[couleursDeLaLigne objectAtIndex:q]redComponent]*distPB) + ([[couleursDeLaLigne objectAtIndex:(q+1)]redComponent]*distPA))/dist2P) green: ((([[couleursDeLaLigne objectAtIndex:q]greenComponent]*distPB) + ([[couleursDeLaLigne objectAtIndex:(q+1)]greenComponent]*distPA))/dist2P) blue: ((([[couleursDeLaLigne objectAtIndex:q]blueComponent]*distPB) + ([[couleursDeLaLigne objectAtIndex:(q+1)]blueComponent]*distPA))/dist2P) alpha: ((([[couleursDeLaLigne objectAtIndex:q]alphaComponent]*distPB) + ([[couleursDeLaLigne objectAtIndex:(q+1)]alphaComponent]*distPA))/dist2P)];
                                            NSRect pointC= NSMakeRect((k*distLarge), ligneA[i], distLarge, distKey);
                                            [couleurRect set];
                                            [NSBezierPath fillRect:pointC];
    
                                        }//fin si entre deux points
                                    }//fin for q recherche des points intermédiaires
                                }//fin else entre points extrêmes
                            } //fin for k
                        }//fin si la ligne à dessiner
                    } //fin boucle j
    
                }//fin boucle i
            }//fin dessin des points
    
    
            //dessin des caches. Fond gris si pas de couleur.
            [[NSColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1.0]set];   //couleur gris clair du fond
            for (int i = 0; i < 3; i++){
                int nbBlackLine = 2 + (i * 6);
                [NSBezierPath fillRect:NSMakeRect(0.0, ligneB[nbBlackLine], self.bounds.size.width, distKey)];
            }
    
            [NSBezierPath fillRect:NSMakeRect(0.0, 0.0, self.bounds.size.width, ligneB[0])];
            [NSBezierPath fillRect:NSMakeRect(0.0, ligneB[5], self.bounds.size.width, ligneB[6] - ligneB[5])];
            [NSBezierPath fillRect:NSMakeRect(0.0, ligneB[11], self.bounds.size.width, ligneB[12] - ligneB[11])];
            [NSBezierPath fillRect:NSMakeRect(0.0, ligneB[17], self.bounds.size.width, self.bounds.size.height - ligneB[17])];
    
            //dessin des lignes en blanc
            [[NSColor whiteColor]set];
            for (int i = 0; i < 18; i++){
                [NSBezierPath strokeLineFromPoint:NSMakePoint(0, ligneA[i]) toPoint:NSMakePoint(cadre.size.width,  ligneA[i])];
            }
            [NSBezierPath strokeLineFromPoint:NSMakePoint(cadre.size.width*0.97, ligneB[0]) toPoint:NSMakePoint(cadre.size.width*0.97, ligneB[17])];
    
            //indication des lignes copiées sur les autres lignes car pas de couleur propre à celle-ci
            //si il y a des points de couleur sur la ligne, ils sont dessinés, sinon ce code indique que le timbre correspondant est le même que celle de la ligne indiquée ici :
    
            NSString *likeA2 = @"line like A2";
            NSString *likeC3 = @"line like C3";
            NSString *likeE5 = @"line like E5";
            NSString *noSound = @"no sound or no effect";
            NSString *copieVelMin = @"copied from vel 031";
            NSString *copieVelMax = @"copied from vel 094";
    
            BOOL yaLignes[12];
            for (int ya = 0; ya < 12; ya++)yaLignes[ya] = NO;
            for (int ln = 0; ln < lesLignes.count; ln ++){
                for (int ya = 0; ya < 12; ya++){
                    if ([[lesLignes objectAtIndex:ln]indexNote] == ya)yaLignes[ya] = YES;
                    //NSLog(@"Ligne %d : bool = %d",ya,yaLignes[ya]);
                }
            }
            //NSLog(@"MPE : %lu lignes",lesLignes.count);   //OK
    
            for (int numUneDesTroisNotes = 0; numUneDesTroisNotes < 3; numUneDesTroisNotes ++){
                for (int typeLigne = 0; typeLigne < 4; typeLigne ++){
                    int valBoolLigne = (numUneDesTroisNotes * 4) + typeLigne;
    
                    if (yaLignes[valBoolLigne] == YES){
                    }    //la ligne existe déjà.
    
                    //cas A2
                    else if (numUneDesTroisNotes == 0){
                        if (yaLignes[valBoolLigne + 4] == YES){
    
                            [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                            [likeC3 drawInRect:NSMakeRect(70,ligneA[valBoolLigne] + 1, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
    
                            yaLignes[valBoolLigne] = YES;
                        }//fin copie C4
    
                        else if (yaLignes[valBoolLigne + 8] == YES){
    
                            [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                            [likeE5 drawInRect:NSMakeRect(70,ligneA[valBoolLigne] + 1, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
    
                            yaLignes[valBoolLigne] = YES;
                        }//fin copie E5
    
                        else{
                            [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                            [noSound drawInRect:NSMakeRect(70,ligneA[valBoolLigne] + 1, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
    
                            //Sinon il faut ajouter dans tout le logiciel une couleur nulle!!
                        }  //copieLigne nulle
                    }    //fin A2
    
                    //cas C4
                    else if (numUneDesTroisNotes == 1){
                        if (yaLignes[valBoolLigne - 4] == YES){
    
                            [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                            [likeA2 drawInRect:NSMakeRect(70,ligneA[valBoolLigne] + 1, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
    
                            yaLignes[valBoolLigne] = YES;
                        }//fin copie A2
    
                        else if (yaLignes[valBoolLigne + 4] == YES){
    
                            [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                            [likeE5 drawInRect:NSMakeRect(70,ligneA[valBoolLigne] + 1, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
    
                            yaLignes[valBoolLigne] = YES;
                        }//fin copie E5
    
                        else{
                            [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                            [noSound drawInRect:NSMakeRect(70,ligneA[valBoolLigne] + 1, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
                        }  //copieLigne nulle
                    }    //fin A2
    
                    //cas E5
                    else if (numUneDesTroisNotes == 2){
                        if (yaLignes[valBoolLigne - 4] == YES){
    
                            [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                            [likeC3 drawInRect:NSMakeRect(70,ligneA[valBoolLigne] + 1, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
    
                            yaLignes[valBoolLigne] = YES;
                        }//fin copie A2
    
                        else if (yaLignes[valBoolLigne - 8] == YES){
    
                            [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                            [likeA2 drawInRect:NSMakeRect(70,ligneA[valBoolLigne] + 1, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
    
                            yaLignes[valBoolLigne] = YES;
                        }//fin copie C4
    
                        else{
                            [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                            [noSound drawInRect:NSMakeRect(70,ligneA[valBoolLigne] + 1, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
                        }  //copieLigne nulle
                    }    //fin A2
    
                    //note A2
    
                }   //fin numDesToisNotes.
            }   //fin for types de lignes (valMin,valMax, Press, Slide).
    
    
            //si lignes vel nulles
            BOOL uneLigneVelMinExiste = NO;
            BOOL uneLigneVelMaxExiste = NO;
            for (int numUneDesTroisNotes = 0; numUneDesTroisNotes < 3; numUneDesTroisNotes ++){
                for (int typeLigne = 0; typeLigne < 2; typeLigne ++){
                    int valBoolLigne = (numUneDesTroisNotes * 4) + typeLigne;
                    //NSLog(@"analyse vel ligne %d", valBoolLigne);   //OK
                    if (yaLignes[valBoolLigne] == YES){
                        if (typeLigne == 0)uneLigneVelMinExiste = YES;
                        if (typeLigne == 1)uneLigneVelMaxExiste = YES;
                    }
                }
                //NSLog(@"ligneMin = %d, ligneMax = %d", uneLigneVelMinExiste, uneLigneVelMaxExiste);   //OK
                if ((uneLigneVelMinExiste == YES) && (uneLigneVelMaxExiste == YES)){}
                else if ((uneLigneVelMinExiste == NO) && (uneLigneVelMaxExiste == YES)){
                    for (int numUneDesTroisNotes = 0; numUneDesTroisNotes < 3; numUneDesTroisNotes ++){
                        int copieValMax = numUneDesTroisNotes * 4;
                        [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                        [copieVelMax drawInRect:NSMakeRect(200,ligneA[copieValMax] + 2, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
                    }
                }    //fin des copies velMax vers velMin
                else if ((uneLigneVelMinExiste == YES) && (uneLigneVelMaxExiste == NO)){
                    for (int numUneDesTroisNotes = 0; numUneDesTroisNotes < 3; numUneDesTroisNotes ++){
                        int copieValMax = (numUneDesTroisNotes * 4) + 1;
                        [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                        [copieVelMin drawInRect:NSMakeRect(200,ligneA[copieValMax] + 2, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
                    }
                }    //fin des copies velMin vers velMax
                else if ((uneLigneVelMinExiste == NO) && (uneLigneVelMaxExiste == NO)){
                    for (int numUneDesTroisNotes = 0; numUneDesTroisNotes < 3; numUneDesTroisNotes ++){
    
                        [[NSFont fontWithName:@"Helvetica" size:12.0]set];
                        [noSound drawInRect:NSMakeRect(70,ligneA[(numUneDesTroisNotes * 4)] + 2, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
                        [noSound drawInRect:NSMakeRect(70,ligneA[(numUneDesTroisNotes * 4) + 1] + 2, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
                    }
                }   //fin copies lignes nulles sur velMin & Max
    
            }//fin si pas de note sur lignes vel min ou Max
    
        }   //fin dessin MPE
    

    Plus loin :

    if ([lesLignes count] > 0){
            [[NSColor blackColor]set];
    (…)
    if (typePatch == 6){
                        float ligneA[12];
                        float distKey = cadre.size.height/30.0;
                        float posValues[] = {3.0, 4.0, 6.0, 7.0, 12.0, 13.0, 15.0, 16.0, 21.0, 22.0, 24.0, 25.0};
                        for (int i = 0; i < 12;i++)ligneA[i] = posValues[i] * distKey;
                        int valLigneA = [[lesLignes objectAtIndex:i]indexNote];
                        unCarre = NSMakeRect([unPoint posX] - (distKey/2.0), ligneA[valLigneA], distKey, distKey);
                        //NSLog(@"Appel dessin points MPE, %f, %f, bounds = %f, %f", unCarre.origin.x, unCarre.origin.y, bounds.size.width, bounds.size.height);    //Appelé, fonctionnement correct
                    }
    }
    

    Encore une fois, seul l'affichage n'a pas lieu. Si je clique sur un point - bien que non visible - l'éditeur de timbre apparaît!!

    Merci par avance pour vos suggestions et votre immense expérience.

  • CéroceCéroce Membre, Modérateur

    Ah oui! Le code aurait besoin d'un bon remaniement! (on peut en reparler si c'est un chantier dans lequel tu souhaites t'investir, mais c'est hors-sujet). Toutefois, il vaut mieux réparer le code avant.

    Il n'y a rien qui me saute aux yeux. Mon intuition pencherait pour un état qui ne serait pas rétabli avant le dessin. Quand -drawRect: est appelée, le NSGraphicsContext correspond à la vue, et dans mon souvenir, son GState est réinitialisé (quoique…).

    En l'absence de chose évidente, voici la méthode que je te conseille:

    • désactive des pans entiers de ton code (/* */)
    • essaie de remplacer par un dessin simple: juste afficher un rectangle de couleur
      En activant/désactivant des pans de code, tu pourras délimiter les endroits jusqu'où ça dessine, et finalement cerner la partie qui ne fonctionne pas.
  • HerveHerve Membre

    Merci Céroce. En suivant tes conseils je me suis rendu compte que j'avais fait une grosse erreur de débutant.
    A un moment du code je faisais :
    for (int i = 0; i < 18; i++){ [NSBezierPath strokeLineFromPoint:NSMakePoint(0, ligneA[i]) toPoint:NSMakePoint(cadre.size.width, ligneA[i])]; }

    alors que plus haut il est écrit :
    float ligneA[12];

    Ouhh! Mais Ouhh quoi!!!
    Merci et pardon pour le dérangement. (Hi hi hi!!)

    Le plus étonnant est que le code ait fonctionné auparavant!

  • CéroceCéroce Membre, Modérateur

    Pas de souci!

    Essaie de découper ton code en fonctions; il est trop difficile à suivre en l'état, c'est normal que des erreurs bêtes s'y glissent. Une fonction de 20 lignes est trop longue, 10 ou moins c'est bien.

  • LarmeLarme Membre
    3 juin modifié #11

    Il y a beaucoup trop de code répété à mon avis, or qui dit code répété dit souvent oops, y'a un cas où j'ai mal copié ou alors j'ai modifié un, et il faut remodifier partout en n'en oubliant aucun...
    Il faudra un peu de travail de refactorisation pour qu'il soit plus lisible et plus facile à maintenir.

    Je vois par exemple plein de :

    [[NSFont fontWithName:@"Helvetica" size:12.0]set];
    [likeE5 drawInRect:NSMakeRect(70,ligneA[valBoolLigne] + 1, 400, distKey - 2.0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]];
    

    Et seul likeE5 est modifié.

    Je conseillerais aussi de ne pas faire du code en une seule ligne.

     NSColor *couleurRect = [NSColor colorWithCalibratedRed: [[couleursDeLaLigne lastObject]redComponent] green: [[couleursDeLaLigne lastObject]greenComponent] blue: [[couleursDeLaLigne lastObject]blueComponent] alpha:  [[couleursDeLaLigne lastObject]alphaComponent]];
    

    ->

    NSColor *couleurRect = [NSColor colorWithCalibratedRed: [[couleursDeLaLigne lastObject]redComponent]
                                                     green: [[couleursDeLaLigne lastObject]greenComponent]
                                                      blue: [[couleursDeLaLigne lastObject]blueComponent]
                                                     alpha:  [[couleursDeLaLigne lastObject]alphaComponent]];
    

    D'utiliser également les short syntax pour les dictionaires/array :

    [NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:30.0], NSFontNameAttribute, [NSColor darkGrayColor], NSForegroundColorAttributeName, nil]]
    

    ->

    @{ NSFontNameAttribute: [NSFont systemFontOfSize:30.0],
       NSForegroundColorAttributeName: [NSColor darkGrayColor] }
    
  • HerveHerve Membre

    Oui, ce sont de bons conseils. Merci. J'en tiendrai compte.

Connectez-vous ou Inscrivez-vous pour répondre.