Affichage de mon rectangle

PatyomPatyom Membre
janvier 2018 modifié dans Objective-C, Swift, C, C++ #1

Bonjour,
comment faites-vous pour afficher un rectangle avec sa couleur intérieure ?
Voilà ce que j'ai fait

    // Si les textes existent, on les dessines
    if let lesTextes = listeTextes {
        for texte in lesTextes {
            let attrTexte = NSAttributedString(
                string: texte.text,
                attributes: [
                    NSFontAttributeName : texte.police,
                    NSForegroundColorAttributeName : texte.couleur
                ])
            attrTexte.draw(at: texte.point)

        }
    }

    // Si des rectangles existent, on le dessine
    if let lesRectangles = listeRectangles {
        for rect in lesRectangles {
           let attrRect =  NSMakeRect(CGFloat(rect.x), CGFloat(rect.y), CGFloat(rect.width), CGFloat(rect.height))


        }

    }

Là il y a une procédure d' affichage de textes dans mon image, çà cela fonctionne parfaitement
la variable tableau "listeTextes" basé sur une structure comme,

struct TypeTexte {
    var point   : NSPoint
    var text    : String
    var police  : NSFont
    var couleur : NSColor
}

Donc j'ai fait la même chose avec les rectangle,
la variable tableau "listeRectangles" basé sur une structure comme,

struct TypeRectangle {
    var x: Int = 0
    var y: Int = 0
    var width: Int = 0
    var height: Int = 0
    var couleur : NSColor
}

Ensuite c'est sur le code de l'affichage que je bute depuis un certain temps

Est-ce que je suis dans la bonne direction ?

Réponses

  • Bonjour,

    Tu peux utiliser Quartz https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html#//apple_ref/doc/uid/TP30001066

    Pour un rectangle tu auras par exemple :
    CGContextAddRect (contex, mcgr);
    CGContextStrokePath(contex);
    Et s'il est rempli :
    CGContextFillRect (contex, mcgr);
    avant.

    Où mcgr est de type CGRect.

  • CéroceCéroce Membre, Modérateur
    janvier 2018 modifié #3

    Une option de plus haut niveau est d'utiliser NSBezierPath:

    rect.couleur.setFill()
    let bounds = CGRect(x: rect.x, y: rect.y, width: rect.width, height: rect.height)
    NSBezierPath.fill(bounds)
    

    Ça change la couleur dans le NSGraphicsContext courant; en pratique, ce n'est donc à utiliser que dans la méthode NSView.draw(_:).

    L'aspect pratique est qu'on n'a pas à se soucier de ces histoires de CGContext. Mais la réponse d'Eric reste valable.

  • Ok, C'est bon, j'ai compris.
    Maintenant, comme je cumule les figures, je n'arrive pas à écrire sur (dans) un rectangle que je viens de créer, qui lui-même a été créé sur un grand rectangle.
    En fait le dernier rectangle me cache le texte pourtant je les ai créé dans l'ordre afin de pouvoir lire le texte en final.

  • @Patyom a dit :
    Ok, C'est bon, j'ai compris.
    Maintenant, comme je cumule les figures, je n'arrive pas à écrire sur (dans) un rectangle que je viens de créer, qui lui-même a été créé sur un grand rectangle.
    En fait le dernier rectangle me cache le texte pourtant je les ai créé dans l'ordre afin de pouvoir lire le texte en final.

    Dans ton code, ci dessus tu dessine d'abord tous les textes puis après les rectangles

    Il faudrait inverser les deux boucles

  • Sinon sur CGRect il y a la méthode func fill(using operation: NSCompositingOperation = default) qui fait un boulot plus que descent sans l'overhead de la création d'un NSBezierPath et avec en plus une option de fusion qu'elle peut s'avérer pratique :

    rect.couleur.setFill()
    CGRect(x: rect.x, y: rect.y, width: rect.width, height: rect.height).fill()
    
  • Si tu as des objets qui se superposent, tu peux dessiner avec un degré de transparence avec CGContextSetAlpha

  • CéroceCéroce Membre, Modérateur

    @Pyroh a dit :
    Sinon sur CGRect il y a la méthode func fill(using operation: NSCompositingOperation = default) qui fait un boulot plus que descent sans l'overhead de la création d'un NSBezierPath

    Argh, je savais que quelque chose comme ça existait, mais je ne parvenais pas à la retrouver dans la doc.

  • Dans ton code, ci dessus tu dessine d'abord tous les textes puis après les rectangles

    Il faudrait inverser les deux boucles <<<<<<

    Joli, et bien vu c'était aussi simple que ça

    sinon Pyroh, je note ta solution

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