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?

texte alt http://grab.by/26Ye


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 ...

texte alt http://grab.by/2714

... 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: (

texte alt http://grab.by/27aM

Était-ce utile?

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.

- CGContextClip

Ainsi, le chemin de dessin en cours est pas de l'état graphique. Alors, voici ce que vous faites:

  1. Construire chemin dessin
  2. Enregistrer gstate
  3. Ajouter chemin de dessin en cours au chemin; Chemin de dessin courant clair
  4. Dessine gradient
  5. Restaurer gstate (chemin de détourage précédent est restauré, chemin dessin reste vide)
  6. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top