Affichage de mon rectangle
Patyom
Membre
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 ?
Connectez-vous ou Inscrivez-vous pour répondre.
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.
Une option de plus haut niveau est d'utiliser NSBezierPath:
Ç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.
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éthodefunc fill(using operation: NSCompositingOperation = default)
qui fait un boulot plus que descent sans l'overhead de la création d'unNSBezierPath
et avec en plus une option de fusion qu'elle peut s'avérer pratique :Si tu as des objets qui se superposent, tu peux dessiner avec un degré de transparence avec
CGContextSetAlpha
Argh, je savais que quelque chose comme ça existait, mais je ne parvenais pas à la retrouver dans la doc.
Il faudrait inverser les deux boucles <<<<<<
Joli, et bien vu c'était aussi simple que ça
sinon Pyroh, je note ta solution