Aller au contenu


Photo

Comment dessiner des lignes et écrire du texte sur une image


  • Please log in to reply
71 réponses à ce sujet

#21 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 84 messages

Posté 19 juillet 2017 - 08:50

Bonjour,

Petite remarque, j'arrive bien à créer mon graphique avec les bonnes ligne verticales dans le Rect mais ce que je ne sais pas faire c'est recopier la totalité de ce qu'il y a dans le Rect (graph + lignes + textes) dans mon imageView prédéfinie dans le Main Storyboard.

 

Je fais :

// Graph01 c'est mon imageView
Graph01.image = maVue.image

mais bien entendu il ne copie que l'image.

il faut que j'ajoute la couche avec les lignes et celle avec les textes.

Là, je ne sais pas faire



#22 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 19 juillet 2017 - 12:26

Une version légèrement modifiée de la classe ne gérant plus d’image. Tu n’en a pas besoin, si tu utilises une imageView en fond d’écran.

import Foundation
import Cocoa

struct TypeLigne {
    var point1  : NSPoint
    var point2  : NSPoint
    var width   : CGFloat
    var couleur : NSColor
}

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

class ViewAvecCalque : NSView {
    var listeLignes : [TypeLigne]?
    var listeTextes : [TypeTexte]?
    
    override func draw(_ dirtyRect: NSRect) {
        
        // Si les lignes existent on les dessines sur la vue
        if let lesLignes = listeLignes {
            for ligne in lesLignes {
                let path = NSBezierPath()
                ligne.couleur.set()
                path.move(to: ligne.point1)
                path.line(to: ligne.point2)
                path.lineWidth = ligne.width
                path.stroke()
            }
        }
        
        // 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)
            }
        }
        
    }
    
}
 

Mise en oeuvre :

 

J’ai utilisé Storyboard pour créer 3 imagesView et 3 ViewAvecCalque. Chaque imageView est recouverte d’une ViewAvecCalque. J’ai défini un jeu de contraintes de sorte que chaque ViewAvecCalque possède les mêmes dimensions et la même position que la vue qu’elle recouvre. 

 

Si tu ne sais pas te servir de Storyboard pour créer graphiquement des vues personnalisées, ou créer des contraintes pour cloner une caractéristique graphique d’un objet (taille et dimension) dis-le je t’expliquerait.

 

Pour en revenir au sujet, j’ai 3 liens (IBOutlet) vers les imagesView et 3 vers les Calques. Il suffit ensuite d’envoyer les bonnes données sur les différents calques, pour dessiner les lignes et les textes.

import Foundation
import Cocoa

class ViewController: NSViewController {
    
    @IBOutlet weak var imageView1: NSImageView!
    @IBOutlet weak var imageView2: NSImageView!
    @IBOutlet weak var imageView3: NSImageView!
    
    @IBOutlet weak var vueCalque1: ViewAvecCalque!
    @IBOutlet weak var vueCalque2: ViewAvecCalque!
    @IBOutlet weak var vueCalque3: ViewAvecCalque!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        imageView1.image = NSImage.init(named: "BlueSky")
        imageView2.image = NSImage.init(named: "textureParchemin1")
        imageView3.image = NSImage.init(named: "tileVert")
        
        // Lignes
        vueCalque1.listeLignes = creerLignes()
        vueCalque2.listeLignes = creerLignes()
        vueCalque3.listeLignes = creerLignes()
        
        // Textes
        vueCalque1.listeTextes = creerTextes1()
        vueCalque2.listeTextes = creerTextes2()
        vueCalque3.listeTextes = creerTextes3()
        
        
    }
    
    func creerLignes() -> [TypeLigne] {
        
        // Ligne Rouge
        let ligne1 = TypeLigne(point1: NSMakePoint(0,0),
                               point2: NSMakePoint(100,30),
                               width: 3.0,
                               couleur: NSColor.red)
        
        // Ligne Bleu
        let ligne2 = TypeLigne(point1: NSMakePoint(0, 0),
                               point2: NSMakePoint(180, 40),
                               width: 3.0,
                               couleur: NSColor.blue)
        
        // Stockage des lignes dans un tableau
        var tableauLignes = [TypeLigne]()
        tableauLignes.append(ligne1)
        tableauLignes.append(ligne2)
        
        return tableauLignes
        
    }
    
    func creerTextes1() -> [TypeTexte] {
        
        let t1 = TypeTexte(point: NSMakePoint(15, 40),
                           text: "VuePersonnalisée 1",
                           police: NSFont.boldSystemFont(ofSize: 17.0),
                           couleur: NSColor.blue)
        
        var tableau = [TypeTexte]()
        tableau.append(t1)
        return tableau
    }
    
    func creerTextes2() -> [TypeTexte] {
        
        let t1 = TypeTexte(point: NSMakePoint(15, 40),
                           text: "VuePersonnalisée 2",
                           police: NSFont.boldSystemFont(ofSize: 17.0),
                           couleur: NSColor.red)
        
        var tableau = [TypeTexte]()
        tableau.append(t1)
        return tableau
    }
    
    func creerTextes3() -> [TypeTexte] {
        
        let t1 = TypeTexte(point: NSMakePoint(15, 40),
                           text: "VuePersonnalisée 3",
                           police: NSFont.boldSystemFont(ofSize: 17.0),
                           couleur: NSColor.black)
        
        var tableau = [TypeTexte]()
        tableau.append(t1)
        return tableau
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }

}

Fichier(s) joint(s)


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#23 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 19 juillet 2017 - 12:30

Ton approche est assez compliqué, avec les 3 imagesView.

Si j'avais eu à faire la même chose, j’aurais viré toutes les imagesView pour n’utiliser qu’une vue personnalisée UNIQUE s’occupant d’assembler les images de fond et de l’affichage des lignes et textes.


  • Joanna Carter aime ceci

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#24 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 19 juillet 2017 - 12:40

Si j'avais eu à faire la même chose, j’aurais viré toutes les imagesView pour n’utiliser qu’une vue personnalisée UNIQUE s’occupant d’assembler les images de fond et de l’affichage des lignes et textes.

 

C'est beaucoup mieux comme ça



#25 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 84 messages

Posté 19 juillet 2017 - 12:57

Bien, alors pouvez-vous m'expliquer comment regrouper 3 images dans une seule imageView ou Rect ?



#26 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 19 juillet 2017 - 13:54

La solution est déjà présente dans l’une des premières versions de ViewAvecCalque :

import Foundation
import Cocoa

struct TypeLigne {
    var point1  : NSPoint
    var point2  : NSPoint
    var width   : CGFloat
    var couleur : NSColor
}

struct TypeTexte {
    var point : NSPoint
    var text  : NSAttributedString
}

class ViewAvecCalque : NSView {
    var image : NSImage?
    var listeLignes : [TypeLigne]?
    var listeTextes : [TypeTexte]?
    
    override func draw(_ dirtyRect: NSRect) {
        let rect = dirtyRect
        
        // Si l'image existe on la dessine sur la vue
        if let image = image {
            image.draw(in: rect)
        }
        
        // Si les lignes existent on les dessines sur la vue
        if let lesLignes = listeLignes {
            for ligne in lesLignes {
                let path = NSBezierPath()
                ligne.couleur.set()
                path.move(to: ligne.point1)
                path.line(to: ligne.point2)
                path.lineWidth = ligne.width
                path.stroke()
            }
        }
        
        // Si les textes existent, on les dessines
        if let lesTextes = listeTextes {
            for texte in lesTextes {
                texte.text.draw(at: texte.point)
            }
        }
        
    }
    
}

Plus précisément :

override func draw(_ dirtyRect: NSRect) {
        let rect = dirtyRect
        
        // Si l'image existe on la dessine sur la vue
        if let image = image {
            image.draw(in: rect)
        }

L’image est affichée sur la totalité du rectangle de la vue personnalisée. En modifiant le rectangle d’affichage, on peut donner n’importe taille ou position à l’image.

 

Nouvelle version de la fonction utilisant cette technique pour afficher les 3 images dans la Vue Personnalisée.

class ViewAvecCalque : NSView {
    var listeLignes : [TypeLigne]?
    var listeTextes : [TypeTexte]?
    var image1 : NSImage?
    var image2 : NSImage?
    var image3 : NSImage?
    
    override func draw(_ dirtyRect: NSRect) {
        let rect = dirtyRect
        
        // Si l'image 1 existe on la dessine sur la vue
        // Bande supérieure de la vue
        if let image1 = image1 {
            let rectAffichage = CGRect(x: 0,
                                       y: 0,
                                       width: rect.width,
                                       height: rect.height/3.0)
            image1.draw(in: rectAffichage)
        }
        
        // bande du milieude la vue
        if let image2 = image2 {
            let rectAffichage = CGRect(x: 0,
                                       y: rect.height/3.0,
                                       width: rect.width,
                                       height: rect.height/3.0)
            image2.draw(in: rectAffichage)
        }
        
        // bande du bas de la vue
        if let image3 = image3 {
            let rectAffichage = CGRect(x: 0,
                                       y: rect.height*2/3.0,
                                       width: rect.width,
                                       height: rect.height/3.0)
            image3.draw(in: rectAffichage)
        }
        
        
        // Si les lignes existent on les dessines sur la vue
        if let lesLignes = listeLignes {
            for ligne in lesLignes {
                let path = NSBezierPath()
                ligne.couleur.set()
                path.move(to: ligne.point1)
                path.line(to: ligne.point2)
                path.lineWidth = ligne.width
                path.stroke()
            }
        }
        
        // 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)
            }
        }
        
    }
    
}

EDIT : Bon, ça marche PRESQUE ! Il y a une inversion de l’ordre d’affichage des bandes. J’ai codé avec une logique iOS alors que l’orientation de l’axe y est inversé sur ce fichu macOS.. Je dois filer, je n’ai pas le temps de régler le problème. Ce n’est pas difficile à faire. Tu devrais y arriver par toi-même.


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#27 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 84 messages

Posté 20 juillet 2017 - 14:17

c'est bon, je suis arrivé à édifier mon prog d'affichage images + lignes (textes pas encore, mais çà va venir) et je vous remercie de vos conseils, j'ai eu un peu de mal avec les horaires pour placer les lignes (pb avec les Floats et les minutes à transformer) oui parce que les lignes verticales correspondaient à des heures précises.

 

Maintenant il faut que j'enregistre tout ce que j'ai empilé dans mon Rect global (j'ai opté pour le Rect global, c'est plus simple).

 

là, non plus c'est pas gagné.



#28 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 20 juillet 2017 - 16:04

Tout frais, tout chaud :

import Foundation
import Cocoa

struct TypeLigne {
    var point1  : NSPoint
    var point2  : NSPoint
    var width   : CGFloat
    var couleur : NSColor
}

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

class ViewAvecCalque : NSView {
    var listeLignes1 : [TypeLigne]?
    var listeLignes2 : [TypeLigne]?
    var listeLignes3 : [TypeLigne]?
    var listeTextes1 : [TypeTexte]?
    var listeTextes2 : [TypeTexte]?
    var listeTextes3 : [TypeTexte]?
    var image1  : NSImage?
    var image2  : NSImage?
    var image3  : NSImage?
    
    override func draw(_ dirtyRect: NSRect) {
        
        func dessinerLignes(liste:[TypeLigne]?, offsetY:CGFloat) {
            guard let lesLignes = liste else { return }
            for ligne in lesLignes {
                // Ajustement des coordonnées à partir de l'offset y
                let pointA = NSMakePoint(ligne.point1.x, ligne.point1.y + offsetY)
                let pointB = NSMakePoint(ligne.point2.x, ligne.point2.y + offsetY)
                let path = NSBezierPath()
                ligne.couleur.set()
                path.move(to: pointA)
                path.line(to: pointB)
                path.lineWidth = ligne.width
                path.stroke()
            }
        }
        
        func dessinerTextes(liste:[TypeTexte]?, offsetY:CGFloat) {
            guard let lesTextes = liste else { return }
            for texte in lesTextes {
                let attrTexte = NSAttributedString(
                    string: texte.text,
                    attributes: [
                        NSFontAttributeName : texte.police,
                        NSForegroundColorAttributeName : texte.couleur
                    ])
                let position = NSMakePoint(texte.point.x, texte.point.y + offsetY)
                attrTexte.draw(at: position)
            }
        }

        let rect = dirtyRect
        
        // Calcul des zones graphiques
        let rect1 = CGRect(x: 0,
                           y: rect.height*2/3.0,
                           width: rect.width,
                           height: rect.height/3.0)
        let rect2 = CGRect(x: 0,
                           y: rect.height/3.0,
                           width: rect.width,
                           height: rect.height/3.0)
        let rect3 = CGRect(x: 0,
                           y: 0,
                           width: rect.width,
                           height: rect.height/3.0)
        
        // Si l'image 1 existe on la dessine sur la vue
        // Bande supérieure de la vue
        if let image1 = image1 {
            image1.draw(in: rect1)
        }
        
        // bande du milieu de la vue
        if let image2 = image2 {
            image2.draw(in: rect2)
        }
        
        // bande du bas de la vue
        if let image3 = image3 {
            image3.draw(in: rect3)
        }
        
        // Si les lignes existent on les dessines sur la vue
        dessinerLignes(liste: listeLignes1, offsetY: rect1.origin.y)
        dessinerLignes(liste: listeLignes2, offsetY: rect2.origin.y)
        dessinerLignes(liste: listeLignes3, offsetY: rect3.origin.y)
        
        // Si les textes existent, on les dessines
        dessinerTextes(liste: listeTextes1, offsetY: rect1.origin.y)
        dessinerTextes(liste: listeTextes2, offsetY: rect2.origin.y)
        dessinerTextes(liste: listeTextes3, offsetY: rect3.origin.y)
    }
}

Utilisation :

import Foundation
import Cocoa

class ViewController: NSViewController {
    
    @IBOutlet weak var vueCalque: ViewAvecCalque!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        vueCalque.image1 = NSImage.init(named: "BlueSky")
        vueCalque.image2 = NSImage.init(named: "textureParchemin1")
        vueCalque.image3 = NSImage.init(named: "tileVert")
        
        // Lignes
        vueCalque.listeLignes1 = creerLignes()
        vueCalque.listeLignes2 = creerLignes()
        vueCalque.listeLignes3 = creerLignes()
        
        // Textes
        vueCalque.listeTextes1 = creerTextes1()
        vueCalque.listeTextes2 = creerTextes2()
        vueCalque.listeTextes3 = creerTextes3()
        
    }
    
    func creerLignes() -> [TypeLigne] {
        
        // Ligne Rouge
        let ligne1 = TypeLigne(point1: NSMakePoint(0,0),
                               point2: NSMakePoint(100,30),
                               width: 3.0,
                               couleur: NSColor.red)
        
        // Ligne Bleu
        let ligne2 = TypeLigne(point1: NSMakePoint(0, 0),
                               point2: NSMakePoint(180, 40),
                               width: 3.0,
                               couleur: NSColor.blue)
        
        // Stockage des lignes dans un tableau
        var tableauLignes = [TypeLigne]()
        tableauLignes.append(ligne1)
        tableauLignes.append(ligne2)
        
        return tableauLignes
        
    }
    
    func creerTextes1() -> [TypeTexte] {
        
        let t1 = TypeTexte(point: NSMakePoint(15, 40),
                           text: "VuePersonnalisée 1",
                           police: NSFont.boldSystemFont(ofSize: 17.0),
                           couleur: NSColor.blue)
        
        var tableau = [TypeTexte]()
        tableau.append(t1)
        return tableau
    }
    
    func creerTextes2() -> [TypeTexte] {
        
        let t1 = TypeTexte(point: NSMakePoint(15, 40),
                           text: "VuePersonnalisée 2",
                           police: NSFont.boldSystemFont(ofSize: 17.0),
                           couleur: NSColor.red)
        
        var tableau = [TypeTexte]()
        tableau.append(t1)
        return tableau
    }
    
    func creerTextes3() -> [TypeTexte] {
        
        let t1 = TypeTexte(point: NSMakePoint(15, 40),
                           text: "VuePersonnalisée 3",
                           police: NSFont.boldSystemFont(ofSize: 17.0),
                           couleur: NSColor.black)
        
        var tableau = [TypeTexte]()
        tableau.append(t1)
        return tableau
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}

Fichier(s) joint(s)

  • Fichier joint  final.jpg   104,69 Ko   0 téléchargement(s)

  • Joanna Carter aime ceci

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#29 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 20 juillet 2017 - 16:13

Et juste pour te montrer qu'il n'est pas facile à dessiner, voici du code d'un ancien projet (oui, c'est ObjC  8--) ) qui montre comment séparer le dessin des éléments pour le faire plus facile à lire

@interface AFMCentreOfGravityEnvelopeDrawingVisitor ()

@property (weak, nonatomic) AFMCentreOfGravityEnvelope *centreOfGravityEnvelope;

@property (weak, nonatomic, readonly) AFMWeightUnit *weightUnit;


@property (nonatomic, readonly) NSUInteger minimumAircraftWeight;

@property (nonatomic, readonly) NSUInteger maximumAircraftWeight;

@property (nonatomic, readonly) CGFloat minimumCoG;

@property (nonatomic, readonly) CGFloat maximumCoG;


@property (nonatomic, readonly) CGFloat leftLegendMargin;

@property (nonatomic, readonly) CGFloat bottomLegendMargin;

@property (nonatomic, readonly) CGFloat outerMargin;


@property (nonatomic, readonly) CGFloat xAxisZero;

@property (nonatomic, readonly) CGFloat xAxisMaximum;

@property (nonatomic, readonly) CGFloat yAxisZero;

@property (nonatomic, readonly) CGFloat yAxisMaximum;


@property (copy, nonatomic, readonly) NSString *xAxisLabelText;

@property (copy, nonatomic, readonly) NSString *yAxisLabelText;

@property (nonatomic, readonly) CGFloat xAxisMajorTickY;

@property (nonatomic, readonly) CGFloat xAxisMinorTickY;

@property (nonatomic, readonly) CGFloat yAxisMajorTickX;

@property (nonatomic, readonly) CGFloat yAxisMinorTickX;


@property (nonatomic, readonly) CGPoint graphOrigin;

@property (nonatomic, readonly) CGSize graphSize;

@property (nonatomic, readonly) CGRect graphBounds;


@property (nonatomic, readonly) CGFloat xAxisScaleFactor;

@property (nonatomic, readonly) CGFloat yAxisScaleFactor;


- (void)drawHorizontalGridLineForWeight:(CGFloat)weight;

- (void)drawVerticalGridLineForCoG:(CGFloat)coG;

- (void)drawGridLines;


- (void)drawXMajorTickMarkForCoG:(CGFloat)coG;

- (void)drawXMajorTickMarkLabelForCoG:(CGFloat)coG;

- (void)drawXMinorTickMarkForCoG:(CGFloat)coG;

- (void)drawXTickMarks;

- (void)drawXAxisLine;


- (void)drawYMajorTickMarkForWeight:(CGFloat)weight;

- (void)drawYMajorTickMarkLabelForWeight:(CGFloat)weight;

- (void)drawYMinorTickMarkForWeight:(CGFloat)weight;

- (void)drawYTickMarks;

- (void)drawYAxisLine;


- (void)drawXAxisLabel;

- (void)drawYAxisLabel;


- (void)drawAxes;


- (void)drawTitle;

@property (strong, nonatomic, readonly) NSDictionary *text12Attributes;

@property (strong, nonatomic, readonly) NSDictionary *text14Attributes;

@property (strong, nonatomic, readonly) NSDictionary *text14BoldAttributes;

@end


#30 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 20 juillet 2017 - 16:15

* hurle d’horreur avant de s’évanouir ! *


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#31 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 20 juillet 2017 - 16:17

Je peux te montrer plus  8--)



#32 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 20 juillet 2017 - 16:29

Nooonnnnn pitié !


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#33 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 20 juillet 2017 - 16:40

OK, juste pour toi mon petit :

protocol AFMCentreOfGravityEnvelopeDrawingVisitor
{
  var centreOfGravityEnvelope: AFMCentreOfGravityEnvelope
  
  var weightUnit: AFMWeightUnit
  
  
  var minimumAircraftWeight: Int { get }
  
  var maximumAircraftWeight: Int { get }
  
  var minimumCoG: CGFloat { get }
  
  var maximumCoG: CGFloat { get }
  
  
  var leftLegendMargin: CGFloat { get }
  
  var bottomLegendMargin: CGFloat { get }
  
  var outerMargin: CGFloat { get }
  
  
  var xAxisZero: CGFloat { get }
  
  var xAxisMaximum: CGFloat { get }
  
  var yAxisZero: CGFloat { get }
  
  var yAxisMaximum: CGFloat { get }
  
  
  var xAxisLabelText: String { get }
  
  var yAxisLabelText: String { get }
  
  var xAxisMajorTickY: CGFloat { get }
  
  var xAxisMinorTickY: CGFloat { get }
  
  var yAxisMajorTickX: CGFloat { get }
  
  var yAxisMinorTickX: CGFloat { get }
  
  
  var graphOrigin: CGPoint { get }
  
  var graphSize: CGSize { get }
  
  var graphBounds: CGRect { get }
  
  
  var xAxisScaleFactor: CGFloat { get }
  
  var yAxisScaleFactor: CGFloat { get }
  
  
  func drawHorizontalGridLine(for weight: CGFloat)
  
  func drawVerticalGridLine(for coG: CGFloat)
  
  func drawGridLines()
  
  
  func drawXMajorTickMark(for coG: CGFloat)
  
  func drawXMajorTickMarkLabel(for coG: CGFloat)
  
  func drawXMinorTickMark(for coG: CGFloat)
  
  func drawXTickMarks()
  
  func drawXAxisLine()
  
  
  func drawYMajorTickMark(for weight: CGFloat)
  
  func drawYMajorTickMarkLabel(for weight: CGFloat)
  
  func drawYMinorTickMark(for weight: CGFloat)
  
  func drawYTickMarks()
  
  func drawYAxisLine()
  
  
  func drawXAxisLabel()
  
  func drawYAxisLabel()
  
  
  func drawAxes()
  
  
  func drawTitle()
  
  
  var text12Attributes: NSDictionary { get }
  
  var text14Attributes: NSDictionary { get }
  
  var text14BoldAttributes: NSDictionary { get }
}


#34 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 20 juillet 2017 - 17:02

* dans le coma , ne voit rien, n’entend rien *


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#35 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 84 messages

Posté 20 juillet 2017 - 17:39

Draken, tu es sur de çà :

 @IBOutlet weak var vueCalque: ViewAvecCalque!

je ne comprend pas



#36 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 20 juillet 2017 - 17:52

Draken, tu es sur de çà :

 @IBOutlet weak var vueCalque: ViewAvecCalque!

je ne comprend pas

Oui, j’en suis certain. D’autant plus que c’est Storyboard qui a généré cette ligne quand j’ai demandé un IBOulet sur une vue personnalisée.

 

On peux aussi créer la ViewAvecCalque avec du code, sans passer par Storyboard,  à l’ancienne. 


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#37 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 20 juillet 2017 - 23:54

Ce n’est pas compliqué d’utiliser une vue personnalisée dans Storyboard.

 

La technique habituelle, que tu connais, c’est de glisser-déposer des composants graphiques de base (NSImageView, NSLabel, NSView, etc.) sur l’écran, et de tirer des IBOutlet vers le code pour les utiliser. La démarche est presque similaire. 

 

Etape 1 : On glisse-déposer sur l’écran un composant graphique « Custom View ».

Fichier(s) joint(s)

  • Fichier joint  tuto1.jpg   90,84 Ko   0 téléchargement(s)

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#38 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 21 juillet 2017 - 00:08

Etape 2 :

 

- On sélectionne la "Custom View » et on affiche l’inspecteur d’identité.

- L’option « Custom Class » permet de définir la classe à associer avec la « Custom View ». Il suffit de cliquer sur l'option « Class » pour voir une (longue) liste de classes possibles. ViewAvecCalque étant créée à partir de NSView, Xcode l’ajoute automatiquement dans la liste. 

- Une fois « ViewAvecCalque » sélectionnée, Xcode sait que la « Custom View » appartient à cette classe. En faisant un IBOutlet sur cette vue, il génère automatiquement les bons paramètres.

 @IBOutlet weak var vueCalque: ViewAvecCalque!

Fichier(s) joint(s)

  • Fichier joint  tuto2.jpg   66,97 Ko   0 téléchargement(s)

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#39 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 84 messages

Posté 21 juillet 2017 - 08:23

Merci, hier soir en cherchant un peu sur Web, j'avais trouvé tout ce que tu viens de me présenter.

Cà s'affiche parfaitement, mes lignes se positionnent exactement aux bons endroits, le rêve.

 

Par contre je voudrais enregistrer cette customView dans un fichier image pour ensuite l'afficher à volonté dans d'autre applis.

 

Je cherche encore mais si tu as une idée je suis preneur. 



#40 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 600 messages
  • LocationParis

Posté 21 juillet 2017 - 09:04

Je t’avais donné un lien sur du code permettant de stocker l’image d’une NSView dans une NSImage, non ?

 

https://pastebin.com/d4puXBi8

 

Ce n’était pas en Swift 3, mais cela m’a pris quelques secondes pour l’adapter (le temps de valider les deux corrections suggérées par Xcode)

extension NSView {
    var snapshot: NSImage {
        guard let bitmapRep = bitmapImageRepForCachingDisplay(in: bounds) else { return NSImage() }
        bitmapRep.size = bounds.size
        cacheDisplay(in: bounds, to: bitmapRep)
        let image = NSImage(size: bounds.size)
        image.addRepresentation(bitmapRep)
        return image
    }
}

Exemple d’utilisation :

 

J’ai utilisé Storyboard pour placer sur l’écran, une vue avec calque, une imageView et un détecteur de clic. Quand l’utilisateur clique sur le calque, le programme fait une copie d’écran de son contenu, pour l’afficher dans l’imageView.

    @IBAction func actionClic(_ sender: NSClickGestureRecognizer) {
        let copieEcran = vueCalque.snapshot
        imageView.image = copieEcran
    }

Fichier(s) joint(s)

  • Fichier joint  tuto3.jpg   102,56 Ko   0 téléchargement(s)

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 





0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)