Frage

ich eine Steigung haben, die abgerundeten Ecken hat, dass ich eine Verwendung für eine benutzerdefinierte UITableViewCell Hintergrund. Ich versuche, einen Schlaganfall auf den Weg gelten, aber kann es nicht ganz tun und kann nicht sehen, wo ich falsch werde.

  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);

Dieser Code rundet das Rechteck rechts und wendet die Steigung, aber arbeitet nicht die Reihe. Wo liegt mein Fehler?

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


EDIT: Wie pro SUBW Empfehlungen, änderte ich den Code zu sein:

    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);

Aber das rect kommt wie dieses ...

alt text http://grab.by/2714

... ohne Grenze. Wenn ich die CGContextStrokePath(c) ändern CGContextStrokeRect(c, rect) sein, bis der Hub zeigt (ich habe es zur Klärung rot). Aber irgendwie, wenn der Weg Streicheln, ich bin keinen Schlaganfall bekommen: (

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

War es hilfreich?

Lösung

Als Reaktion auf Ihren überarbeiteten Code, ich die Dokumentation zitieren:

  

Im Gegensatz zu dem Strompfad, der aktuelle Clipping-Pfad ist Teil des Grafikzustandes. Deshalb, um den lackierbar Bereich durch die Wiederherstellung der Beschneidungspfad zu einem früheren Zustand wieder zu vergrößern, müssen Sie den Grafikzustand speichern, bevor Sie den Grafikzustand Clip und wiederherstellen, nachdem Sie jede abgeschnittene Zeichnung abgeschlossen haben.

     

Nach dem neuen Beschneidungspfad zu bestimmen, die Funktion setzt den aktuellen Pfad Kontext auf einen leeren Pfad.

- CGContextClip

So ist der aktuelle Ziehweg nicht Teil des Grafikzustandes. Also hier ist was Sie tun:

  1. Erstellen Ziehweg
  2. Speichern gstate
  3. In den Beschneidungspfad aktuellen Ziehweg; klar aktuelle Ziehweg
  4. Zeichnen Gradient
  5. Wiederherstellen gstate (iV Beschneidungspfad wird wiederhergestellt; Pfad Zeichnung bleibt leer)
  6. Stroke nichts

Die Lösung ist es, den Pfad in ein CGPath Objekt zu zeichnen, dann fügen sie als Strompfad sowohl vor clipping (nach dem gstate Speicher) und vor dem Streichen.

Sie sollten auch entscheiden, ob Sie das wollen einen äußeren Hub, einen inneren Takt sein, oder eine zentrierte Schlaganfall. Für einen zentrierten Hub, Hub, während nicht abgeschnitten. Für einen inneren Schlaganfall, Schlaganfall, während abgeschnitten. Für einen Außen Hub umgekehrten Weg, dann Clip, dann Schlaganfall. Sie wollen Ihre Linienbreite für beide der letzten beiden Formen verdoppeln, da Sie die Hälfte des Hubes Clipping werden werden.

  

Wenn ich die CGContextStrokePath(c) ändern CGContextStrokeRect(c, rect), der Schlaganfall zeigt bis sein.

Da die Funktion fügt einen Pfad dieses Rechteck auf den aktuellen Ziehweg vor streicht.

Andere Tipps

Nicht sicher, aber vielleicht sind Sie die Steigung über den Hub Malerei?

Sie sind entweder die Steigung über den Hub Zeichnung und / oder Clipping der Region, die Sie Schlaganfall.

Ich denke, die folgenden funktionieren könnte besser:

CGContextSaveGState(c);
CGContextClip(c);

//gradient drawing stuff

CGContextRestoreGState(c);
CGContextStrokePath(c);

Natürlich können Sie auch die Strichfarbe gesetzt und Breite richtig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top