2012-04-09 5 views
0

Beim Versuch, einen CGPoint an eine Methode zu übergeben, wird der Punkt übergeben, aber innerhalb der aufgerufenen Methode zeigen die CGPoint-Werte (inf, inf)? Das Übergeben des CGPoint-Standorts an die createShapeAt-Methode endet also, wenn der Code nicht funktioniert. Vielleicht implementiere ich etwas nicht korrekt oder muss ich den CGPoint kopieren, wenn er übergeben wird?Das Übergeben eines CGPoint an eine andere Methode endet mit (inf, inf)

- (void)handleTap:(UITapGestureRecognizer *)recognizer { 
if ([recognizer isKindOfClass:[UITapGestureRecognizer class]]) 
{ 
    NSLog(@"User just tapped!"); 
    CGPoint location = [recognizer locationInView:recognizer.view]; 
    float scale = [(BasicCanvasUIView *)recognizer.view scale]; 
    location = CGPointMake(location.x/scale, location.y/scale); 
    [self createShapeAt:location]; 
} 
} 

- (void)createShapeAt:(CGPoint)point { 
//Create a managed object to store the shape 
---------------------------------------------------------------------------- 
<-- WHEN I GET HERE ON BREAKPOINT THE (point) VARIABLE SHOWS "(inf,inf)" --> 
---------------------------------------------------------------------------- 
NSManagedObject *shape = nil; 

//Randomly choose a Circle or a Polygon 
int type = arc4random() % 2; 
if (type == 0) { // Circle 
    //Create the circle 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Circle" inManagedObjectContext:self.managedObjectContext]; 
    NSManagedObject *circle = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:self.managedObjectContext]; 
    shape = circle; 

    //Randomly create a radius and set the attributes of the circle 
    float radius = 10 + (arc4random() % 90); 
    [circle setValue:[NSNumber numberWithFloat:point.x] forKey:@"x"]; 
    [circle setValue:[NSNumber numberWithFloat:point.y] forKey:@"y"]; 
    [circle setValue:[NSNumber numberWithFloat:radius] forKey:@"radius"]; 
} else { // Polygon 
    //Create the Polygon 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Polygon" inManagedObjectContext:self.managedObjectContext]; 
    NSManagedObject *polygon = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:self.managedObjectContext]; 
    shape = polygon; 

    //Get the vertices. At this point, no Vertex objects for this shape exist. 
    //Anything you add to the set, however, will be added to the Vertex entity; 
    NSMutableSet *vertices =[polygon mutableSetValueForKey:@"vertices"]; 

    //Create a random number of vertices 
    int nVertices = 3 + (arc4random() % 20); 
    float angleIncrement = (2 * M_PI)/nVertices; 
    int index = 0; 
    for (float i = 0; i < nVertices; i++) { 
     // Generate random values of each vertex 
     float a = i * angleIncrement; 
     float radius = 10 + (arc4random() % 90); 
     float x = point.x + (radius * cos(a)); 
     float y = point.y + (radius * sin(a)); 

     // Create the Vertex managed object 
     NSEntityDescription *vertexEntity = [NSEntityDescription entityForName:@"Vertex" inManagedObjectContext:self.managedObjectContext]; 
     NSManagedObject *vertex = [NSEntityDescription insertNewObjectForEntityForName:[vertexEntity name] inManagedObjectContext:self.managedObjectContext]; 

     //Set teh values for the vertex 
     [vertex setValue:[NSNumber numberWithFloat:x] forKey:@"x"]; 
     [vertex setValue:[NSNumber numberWithFloat:y] forKey:@"y"]; 
     [vertex setValue:[NSNumber numberWithFloat:index++] forKey:@"index"]; 

     //Add the Vertex object to the relationship 
     [vertices addObject:vertex]; 

    }// ----------------- END IF/ELSE (circle and polygon done) ------------------------------------------------------------------------------------- 

    //Set the shapes color 
    [shape setValue:[self makeRandomColor] forKey:@"color"]; 

    //Add the same shape to both canvases 
    [[topView.canvas mutableSetValueForKey:@"shapes"] addObject:shape]; 
    [[bottomView.canvas mutableSetValueForKey:@"shapes"] addObject:shape]; 

    //Save the context 
    NSError *error = nil; 
    if (![self.managedObjectContext save:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    // Tell the views to repaint themselves 
    [topView setNeedsDisplay]; 
    [bottomView setNeedsDisplay]; 

} 
} 
+0

Haben Sie den Wert überprüft, bevor er übergeben wurde? – lnafziger

Antwort

5

Eine offensichtliche Möglichkeit ist, dass recognizer.view.scale Null ist. Hast du das getestet?

Setzen Sie diese Aussage in handleTap:, bevor Sie createShapeAt: nennen:

NSLog(@"recognizer.view.scale = %f", scale); 

Was ist die Ausgabe von dieser Aussage? Wenn es Null ist, ist das dein Problem. Sie müssen eine Skala verwenden, die nicht Null ist.

+0

Ja, ich breche beim Aufruf von self.createShapeAt im Tipphandler und der CGPoint ist da. und ich breche, wenn createShapesAt aufgerufen wird, aber wenn ich die form = nil-Zeile erreiche, wird es (inf, inf). Was ist Inf überhaupt? – jdog

+0

'inf' bedeutet unendlich. Es ist ein spezieller Wert, den Sie normalerweise bekommen, wenn Sie einen "float" oder einen "double" durch Null teilen. Daher mein Vorschlag, dass "scale" gleich null ist. –

+0

Ich habe meine Antwort aktualisiert. –