Surprises au niveau graphique depuis Sonoma 14.0

HerveHerve Membre
novembre 2023 modifié dans Objective-C, Swift, C, C++ #1

Bonjour

Mes programmations sont désorganisées au niveau du GUI depuis que j'ai updaté à Sonoma 14.0. Les NSGradient couvrent tout le GUI au lieu de demeurer limités à leur NSView si j'utilise "drawFromPoint... toPoint...". De même des figures comme des courbes ne se limitent plus au NSView mais s'étendent à toute la fenêtre qui le contient. (il est vrai que le code le permet sauf qu'avant la partie qui déborde de la courbe ne se voyait pas...). Ou plus exactement il déborde d'une onde triangle du cadre au lieu de ne pas apparaître. Code incriminé :

float po = 3.0;
    do {
        [NSBezierPath strokeLineFromPoint:NSMakePoint(po * px, bounds.size.height - py) 
                                  toPoint:NSMakePoint((2 + po) * px, py)];
        [NSBezierPath strokeLineFromPoint:NSMakePoint((2 + po) * px, py) 
                                  toPoint:NSMakePoint((4 + po) * px, bounds.size.height - py)];
        po += 4.0;
    } while ((po * px ) < bounds.size.width);  //avant cela suffisait. Le dessin s'arrête une fois le cadre dépassé mais se voit.

Autre chose, un truc aussi simple que dessiner des cercles ou des rectangles produit des zones floutées, à moitié transparentes. Exemple de code

for (int i = 0; i < nbPointsAnim; i++) {
        PointAnimation *unPoint = [[[Storage sharedSession]lesPointsAnimation]objectAtIndex:i];  //cet objet contient des informations de placement.
        int idTypeObjet = unPoint.idObjet;
        TypeObjet *unType = [[[Storage sharedSession]lesTypesObjets]objectAtIndex:idTypeObjet];  //cet objet contient des infos de couleur, de taille etc.

        [unType.couleurObjet set];
        NSRect rectDessin = NSMakeRect((unPoint.position.x - (unType.taille/2.0)), (unPoint.position.y - (unType.taille/2.0)), unType.taille, unType.taille);
        [[NSBezierPath bezierPathWithOvalInRect:rectDessin]fill];  //Auparavant le dessin était clair, maintenant il est flou.
    }

Avez vous des infos sur ce qui a bien pu se passe? Faut-il attendre une nouvelle version de cet OS ou y a t-il des nouveautés à connaître?

Vous noterez que je travaille encore en ObjectivC. Je ne pense pas que le problème vienne de là.

Réponses

  • CéroceCéroce Membre, Modérateur
    novembre 2023 modifié #2

    Salut @Herve,

    Pour le premier problème: en cherchant "Sonoma NSView clipping", on trouve l'explication.
    Il y a un changement sur la propriété clipsToBounds qui est devenu publique, mais surtout qui a maintenant NO comme valeur par défaut.
    Je te laisse lire les articles, ça devrait être facile à corriger.

    Pour le second problème, je ne sais pas a priori. Peut-être que c'est lié au premier problème, sinon vérifie que tu sauvegardes bien le Graphic State. Je ne me rappelle plus du nom, mais il y a des fonctions push et pop pour sauvegarder et restaurer l'état graphique.

  • Merci Ceroce,

    En effet cela était annoncé mais je n'y avais pas fait attention.
    Ton aide cependant est toujours infiniment précieuse. Ajouter "self.clipsToBounds = YES;" dans "drawRect" a suffit à corriger le problème pour l'exemple 1 de mon post précédent. (dans "drawRect", pas dans" initWithCoder").

    Concernant le floutté de mes cercles, y a t-il une autre info à savoir? Les NSBezierPath fonctionnent TB depuis toujours et il n'y a qu'un seul projet chez moi qui pose ce problème d'ailleurs.

    Merci encore Ceroce.

  • CéroceCéroce Membre, Modérateur

    Pourrais-tu nous donner un peu plus de code ?

    Mon intuition est qu'il y a un mélange de contexte ou d'état graphique, ce qui ferait que les opérations de dessin se cumulent au lieu d'être séparées. Il arrive qu'Apple modifie l'implémentation sous-jacente, aussi une erreur de ta part qui passait jusqu'alors inaperçue peut maintenant avoir un effet.

  • Je ne sais pas ce qui s'est passé et ce que j'ai modifié sans faire attention, mais en revoyant le projet dans Interface Builder, je me suis rendu compte que la NSView y apparaissait flouttée aussi. Je l'ai effacé et ai remis un CustomView "neuf". Le problème est résolu. Ai-je mis un filtre sur la vue sans faire attention? Je ne me rappelle pas.

    Bon, merci encore Céroce, tous les problèmes sont résolus. (Un bug encore dans un moteur audio qui est nouveau lui aussi, l'appli est ancienne pourtant. Une fuite de mémoire sans doute dans la structure C, mais pour le reste tout est résolu)

  • Ya un résumé assez sympa des changements

    ici: https://wwdcnotes.com/notes/wwdc23/10054/

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