L'application d'un coup à un rect arrondi en core-graphiques
-
24-09-2019 - |
Question
I ai un gradient qui a des coins arrondis que je l'utilisant pour un usage fond UITableViewCell. Je suis en train d'appliquer une course sur le chemin mais ne peut pas tout à fait le faire, et ne peut pas voir où je me trompe.
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
minx = minx + 1;
miny = miny ;
maxx = maxx - 1;
maxy = maxy - 1;
CGContextMoveToPoint(c, minx, miny);
CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin);
CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin);
CGContextAddLineToPoint(c, maxx, miny);
CGContextAddLineToPoint(c, minx, miny);
// Fill and stroke the path
CGContextClip(c);
CGContextStrokePath(c);
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND;
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2);
CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0);
CGGradientRelease(myGradient);
CGColorSpaceRelease(myColorspace);
Ce code arrondit le droit du rectangle et applique le gradient, mais ne course pas la ligne. Où est mon erreur?
EDIT:
Selon les recommandations de SUBW, j'ai changé le code à:
CGContextRef c = UIGraphicsGetCurrentContext();
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = nil;
CGFloat components[8] = TABLE_CELL_BACKGROUND;
CGContextSetFillColorWithColor(c, [[UIColor redColor] CGColor]);
CGContextSetStrokeColorWithColor(c, [[UAColor redColor] CGColor]);
CGContextSetLineWidth(c, 2);
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
minx = minx + 1;
miny = miny ;
maxx = maxx - 1;
maxy = maxy - 1;
CGContextMoveToPoint(c, minx, miny);
CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin);
CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin);
CGContextAddLineToPoint(c, maxx, miny);
CGContextAddLineToPoint(c, minx, miny);
// Fill and stroke the path
CGContextSaveGState(c);
CGContextClip(c);
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND;
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2);
CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0);
CGContextRestoreGState(c);
CGContextStrokePath(c);
Mais le rect est comme ça ...
... sans frontière. Si je change le CGContextStrokePath(c)
à CGContextStrokeRect(c, rect)
, la course se présente (je l'ai fait rouge des éclaircissements). Mais en quelque sorte, en caressant le chemin, je ne reçois pas la course: (
La solution
En réponse à votre code révisé, je cite la documentation:
Contrairement au chemin de courant, le chemin de clippage actuel fait partie de l'état des graphiques. Par conséquent, pour ré-agrandir la zone paintable en rétablissant le chemin de détourage à un état antérieur, vous devez enregistrer l'état graphique avant de clipper et de restaurer l'état graphique une fois que vous avez terminé un dessin rognée.
Après avoir déterminé le nouveau chemin de détourage, la fonction permet de restaurer chemin courant du contexte à un chemin vide.
Ainsi, le chemin de dessin en cours est pas de l'état graphique. Alors, voici ce que vous faites:
- Construire chemin dessin
- Enregistrer gstate
- Ajouter chemin de dessin en cours au chemin; Chemin de dessin courant clair
- Dessine gradient
- Restaurer gstate (chemin de détourage précédent est restauré, chemin dessin reste vide)
- rien Stroke
La solution consiste à tracer le chemin d'accès à un objet CGPath, puis l'ajouter en tant que trajet de courant à la fois avant écrêtage (après avoir sauvegardé le gstate) et avant frottant.
Vous devez également décider si vous voulez que ce soit une course extérieure, une course intérieure ou un accident vasculaire cérébral centrée. , Accident vasculaire cérébral sans clipsé pour une course au centre. Pour une course intérieure, accident vasculaire cérébral en clippé. Pour une course extérieure, inverser le chemin d'accès, puis extraire, puis la course. Vous voulez doubler votre largeur de ligne pour les deux deux dernières formes, puisque vous clipping la moitié de la course.
Si je change le
CGContextStrokePath(c)
àCGContextStrokeRect(c, rect)
, la course apparaît.
Parce que cette fonction ajoute un chemin de ce rectangle sur le chemin de dessin en cours avant de caresser.
Autres conseils
Je ne sais pas, mais peut-être vous peignez le gradient sur la course?
Vous dessinez soit le gradient sur la course, et / ou découpage de la région vous caressez.
Je pense que les éléments suivants pourraient mieux fonctionner:
CGContextSaveGState(c);
CGContextClip(c);
//gradient drawing stuff
CGContextRestoreGState(c);
CGContextStrokePath(c);
Bien sûr, vous devez également définir la couleur de la course et la largeur correctement.