[Résolu] Dessiner avec ou sans context
busterTheo
Membre
Bonjour,
je fais des bezier avec ce genre de truc
override func drawRect(myRect: CGRect) {
var monPath: UIBezierPath = UIBezierPath(rect:myRect)
let context = UIGraphicsGetCurrentContext()
CGContextSetLineWidth(context, 2.0)
CGContextSetStrokeColorWithColor(context, UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 1.0).CGColor)
CGContextMoveToPoint(context, 100, 50)
CGContextAddCurveToPoint(context, 100, 250, 300, 250, 300, 50)
CGContextAddCurveToPoint(context, 300, 0, 100, 0, 100, 50)
CGContextStrokePath(context)
}
et je découvre sur le tuto de Ray Wenderlich (http://www.raywenderlich.com/90488/calayer-in-ios-with-swift-10-examples) dans l'exemple 8 (entre autres) que l'on peut faire sans.
C'est de janvier 2015, donc, c'est pas vieux.
Qu'est-ce-qui est mieux ?
Parce que ce qui m'intéresse, c'est qu'il n'utilise pas un drawRect dans une classe (fichier séparé) UIView qui doit être instanciée dans le ViewController, etc
Merci de m'éclairer
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Cool ce lien ! Et cool cette façon de dessiner dans une vue ! C'est compatible iOS 6 ou 7 ?
mort de rire...
ben ouais, je trouve ça cool moi, mais je n'arrive pas à faire un stoke, j'ai une putain d'erreur de 10 kms (le projet tourne bien pourtant) qui me parle de CGContext, alors que y'en n'a pas - oups
Dès que je rajoute ça
derrière le
ça me met ce message
Tu peux créer un contexte graphique sur mesure, sans passer par le drawRect d'une UIView
Exemple d'un code dessinant un dégradé de couleur dans un contexte personnalisé :
Ben oui t'as raison, c'est un truc qui trainait - Désolé
Draken, mais où on place ce genre de code, y'a pas de path, donc je ne peux pas le mettre sur un layer ou dans une View ?
Et moi, je dois faire des
c'est un peu compliqué tout ça.
Et pourquoi on doit faire dans un context ou pas ?
Dans un context, ça donne ça
C'est en Objective-C mais les principes sont là
Et, en Swift :
Voici un exemple utilisant un contexte graphique personnalisé pour fabriquer un dégradé de couleur, et l'afficher dans une UIImageView :
Tout tient dans le code, pas besoin de créer une UIView dans un autre fichier.
Ou, suite à mon dernier message, on peut travailler avec un layer :
Bonjour, et merci encore pour vos réponses qui m'ont été bien utiles.
J'ai donc fait deux projets :
Le premier
Avec des View imbriquées - Ces views sont instanciées d'après les UIView contenant les drawRect et leurs méthodes CGContextAddCurveToPoint(context, 100, 250, 300, 250, 300, 50) etc.
Le second
Sans ces instances, et leur drawRect - Et donc, les dessins sont fait dans des layers associés à des View Apple, avec les méthodes masquePath.addCurveToPoint(CGPointMake(350, 200), controlPoint1: CGPointMake(150, 400), controlPoint2: CGPointMake(350, 400)) etc.
EN gros, qu'elle est la meilleur méthode ?
A savoir que je peux actuellement, avec un scrollView, déplacer et zoomer une image dans un masque avec son contour, sans problème dans chacun des deux projets.
Doit-on préférer les CGContextAddCurveToPoint dans un contexte dans un drawRect dans une classe externe, ou les addCurveToPoint sur un path dans un layer dans le ViewController?
C''est la grande question. Merci d'avance
L'avantage que j'aime avec les CALayer cependant :
- Ces classes font partie de CoreAnimation, et donc par natures sont tout à fait adaptées pour l'animation. Par exemple j'ai déjà implémentée des composants pour dessiner des graphes avec des CAShapeLayer, et j'ai pu animer le changement de taille des barres quand les valeurs changeaient, avec un changement de hauteur animé très facilement, etc. Alors qu'avec drawRect, l'animation, c'est pas le pied
- les classes CALayer comme leur nom l'indique sont des layers (des couches), et peuvent être utilisées comme tel un peu à la manière de Photoshop. C'est pratique pour superposer des calques et des dessins de formes et facilement les faire bouger les uns par rapport aux autres ou changer leurs propriétés (couleurs, épaisseur, etc...)
Mais après c'est aussi une affaire de goût...
Tu as un exemple à donner Ali avec les animations sur un graphique à bar par exemple ? J'aimerais bien faire pareil pour un projet d'étude
Super Joanna !! Je regarde ça.
Merci pour les réponses. Ok, j'adopte les layers.
J'essaie de mettre en pratique tout çà .
Je démarre donc un nouveau projet.
Et pourtant après avoir tester plusieurs codes (réponses du bar, et de google), je ne parviens pas à placer les couleurs de fill et de stoke.
J'ai bien ma forme, mais elle reste noire sans contour, et en plus j'ai une quinzaine d'erreurs (sur les méthodes CGContext... que je n'utilise pas) dans la debugBox. Je ne trouve pas où est mon erreur.
Je laisse le code et les erreurs plus loin.
Je précise que j'ai bien vu ce post et sa résolution, mais ça marche pas.
Merci d'avance.
Le code
Les erreurs (Toutes les méthodes CGContext y passent, je n'en met qu'une)
Ouais désolé, j'avais mal regardé. C'est que je viens de comprendre en regardant à nouveau ce post (exemple huit) aussi.
Et donc, je revenais pour dire que j'avais compris.
En fait je plaçais mes méthodes sur le path, alors qu'elles vont sur le layer.
C'est dingue ça, le layer, en fait, c'est le path. Je croyais que le path était dans le layer (masqueLayer.path = path.CGPath).
Je considère donc le sujet comme résolu, je me met dans le titre du post.
Merci à tous, je peux maintenant me consacrer à enregistrer ce petit path dans le coreData.
C'est génial ce bar.
Je laisse le code pour celui qui en a besoin
J'ai lu en diagonale, ça a l'air bien comme article mais j'ai du mal à comprendre pourquoi il s'embête à créer son propre PieSliceLayer alors que CAShapeLayer suffit.
Je veux dire :
- créer un PieSliceLayer pour avoir un niveau d'abstraction et avoir un truc plus simple à manipuler qui a directement les propriétés startAngle et endAngle, pourquoi pas, c'est plus simple que d'avoir à calculer le CGPath à partir de ces angles à chaque fois. Mais bon, c'est pas la mort non plus et faire une sous-classe juste pour ça n'est pas non plus une absolue nécessité
- par contre dans son article il justifie la création de ce truc parce que CAShapeLayer ne s'anime pas comme il veut (et que la slice "se retourne" lors de l'animation au lieu de changer d'angle et de joliment tourner autour du centre du graphe) comme l'illustre son petit jeu d'images. Or si ça fait cela, c'est parce que les angles qu'il utilise font que les 2 slices (celle de -60° à 60° et celle de -120° à 120°) ne sont pas dans le même sens trigonométrique. Il aurait inversé les 2 angles dans le 2ème cas (de 120° à -120°) ou plutôt les aurait normalisés (de 120° à 240°) pour que le sens de l'arc de cercle de startAngle vers endAngle se fasse toujours dans le même sens dans les 2 cas, et son animation aurait tout de suite mieux marché. Et au lieu de juste corriger ça et continuer à profiter de CAShapeLayer, il a recréé son propre CALayer et réimplémenté la méthode de dessin, juste à cause de ça... alors qu'il aurait pu s'en passer !