2016-06-08 16 views
0

Ich versuche, ein Array von CGRect zu speichern, um es mit CGContextFillRects zu verwenden, aber die CGRect-Variablen, die ich meinem MinorPlotLines-Array zuweise, scheinen nicht gespeichert zu werden. Zu der Zeit, wenn das Objekt sich selbst zeichnet, ist minorPlotLines leer! Weiß jemand was los ist?CGContextFillRects: CGRect * funktioniert nicht. Zugewiesene CGRect-Elemente werden nicht gespeichert

@interface GraphLineView() { 
    int numberOfLines; 
    CGRect *minorPlotLines; 
} 


@end 


@implementation GraphLineView 


- (instancetype) initWithFrame: (CGRect) frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Init code 
     [self setupView]; 
    } 
    return self; 
} 

- (instancetype) initWithCoder: (NSCoder *) aDecoder { 
    if(self == [super initWithCoder:aDecoder]){ 
     [self setupView]; 
    } 
    return self; 
} 

- (void) dealloc { 
    free(minorPlotLines); 
} 

- (void) setupView { 

    numberOfLines = 40; 
    minorPlotLines = malloc(sizeof(struct CGRect)*40); 

    for(int x = 0; x < numberOfLines; x += 2){ 
     //minorPlotLines[x] = *(CGRect*)malloc(sizeof(CGRect)); 
     minorPlotLines[x] = CGRectMake(x*(self.frame.size.width/numberOfLines), 0, 2, self.frame.size.height); 

     // minorPlotLines[x+1] = *(CGRect*)malloc(sizeof(CGRect)); 
     minorPlotLines[x+1] = CGRectMake(0, x*(self.frame.size.height/numberOfLines), self.frame.size.width, 2); 

    } 

    [self setNeedsDisplay]; 
} 

- (void) drawRect:(CGRect)rect { 
    // Drawing code 
    [super drawRect:rect]; 

    for(int x = 0; x < numberOfLines; x += 2){ 
     NSLog(@"R %d = %f", x, minorPlotLines[x].origin.x); 
     NSLog(@"R %d = %f", x+1, minorPlotLines[x+1].origin.y); 
    } 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, [[UIColor yellowColor] CGColor]); 
    CGContextFillRects(context, minorPlotLines, numberOfLines); 

} 
+0

Ok sicher. Aber CGContextFillRects fragt spezifisch nach CGRect *. Was soll ich machen? –

+0

Ich habe versucht, Ihren Code (um den Inhalt von 'minorPlotLines' zu konstruieren und später den Inhalt wieder heraus zu lesen) in ein anderes Projekt kopiert, und es scheint den Inhalt gut zu erhalten, so dass Ihr grundlegender Code selbst vernünftig erscheint. Haben Sie überprüft, um sicherzustellen, dass Sie tatsächlich einen Nicht-Null-Rahmen zum Zeitpunkt der Konstruktion haben (d. H. In "-setupView")? Mit anderen Worten, bist du sicher, dass 'minorPlotLines' tatsächlich ** leer ist ** oder ist es mit einem Array von' CGRectZero's gefüllt? – fullofsquirrels

+0

Sie haben Recht. Ich wünschte, du hättest eine Antwort geschrieben, damit ich dir Internet-Punkte geben kann. Vielen Dank. Eine Frage: Wenn ich ein Diagrammraster mit CGContextFillRects zeichnen möchte, ist CGContextFillRects effizienter als CGContextAddLineToPoint? Sind Rechtecke besser als Linien? Meine Umrandungslinien sind etwa 2 Pixel dick und aktualisieren ihre Position mit 60 fps. –

Antwort

1

Ich habe versucht, den Code ziehen (den Inhalt von minorPlotLines zu konstruieren und zu lesen später die Inhalte wieder aus) in ein anderes Projekt, und es scheint, den Inhalt ganz gut, zu bewahren, so Ihr grundlegender Code selbst Sound scheint.

Ich würde überprüfen, um sicherzustellen, dass Sie tatsächlich einen Rahmen ungleich Null zum Zeitpunkt der Konstruktion des Arrays minorPlotLines (d. H. In -setupView) haben. Es ist durchaus üblich, dass Callbacks zum Laden von UI-Klassen zu einem Zeitpunkt aufgerufen werden, zu dem Ihre Klasse nur teilweise aufgebaut ist (z. B. Callback der UIViewController-Klasse -viewDidLoad), sodass Sie bestimmte Entscheidungen erst später im Ladeprozess verschieben müssen. Layout passiert insbesondere relativ spät im Spiel, und da Ihre -setupView Methode innerhalb einer -init Methode richtig genannt wird, nehme ich an, dass das Framework Ihrer Klasse noch kein Layout zur Verfügung gestellt hat und daher keinen verwendbaren Frame (dh Ihren Frame ist effektiv äquivalent zu CGRectZero).