2016-04-24 15 views
1

Ich versuche, die Bounding-Box von SCNText zu bestimmen, aber getBoundingBoxMin:max: gibt mir immer Null.SCNText getBoundingBoxMin: max: immer Null

Dies ist der Code, der in einer SCNText Klassenerweiterung ausgeführt wird, also self ist die [textNode geometry].

[self setString:newText]; 
    SCNVector3 min = SCNVector3Zero; 
    SCNVector3 max = SCNVector3Zero; 

    SCNNode *textNode = [SCNNode nodeWithGeometry:self]; 
    [textNode getBoundingBoxMin:&min max:&max]; 

    CGSize sizeMax = CGSizeMake(max.x - min.x, 
           max.y - min.y); 

Ich habe auch versucht, diese

[self setString:newText]; 
    SCNVector3 min = SCNVector3Zero; 
    SCNVector3 max = SCNVector3Zero; 

    [self getBoundingBoxMin:&min max:&max]; 

    CGSize sizeMax = CGSizeMake(max.x - min.x, 
           max.y - min.y); 

sizeMax ist immer Null.

HINWEIS: Ich habe entdeckt, warum das Problem auftritt.

Das Problem tritt auf, wenn diese anpassen innerhalb eines Blocks wie folgt aufgerufen wird:

dispatch_async(dispatch_get_main_queue(), 
       ^{     }); 

so, Wenn ich diesen Code aus dem Haupt-Thread aufrufen, es funktioniert:

[self setString:newText]; 
SCNVector3 min = SCNVector3Zero; 
SCNVector3 max = SCNVector3Zero; 

SCNNode *textNode = [SCNNode nodeWithGeometry:self]; 
[textNode getBoundingBoxMin:&min max:&max]; 

CGSize sizeMax = CGSizeMake(max.x - min.x, 
          max.y - min.y); 

aber Wenn ich dies von einem anderen Thread anrufe, wird es nicht funktionieren

dispatch_async(dispatch_get_main_queue(), 
      ^{     
[self setString:newText]; 
SCNVector3 min = SCNVector3Zero; 
SCNVector3 max = SCNVector3Zero; 

SCNNode *textNode = [SCNNode nodeWithGeometry:self]; 
[textNode getBoundingBoxMin:&min max:&max]; 

CGSize sizeMax = CGSizeMake(max.x - min.x, 
          max.y - min.y); 

}); 

Das Problem ist, dass dieser Block von einem Dispatch-Block aufgerufen wird, also muss ich ihn erneut an die Hauptwarteschlange senden, aber dadurch wird verhindert, dass der Code funktioniert. Theoretisch sollte das Senden eines Blocks an die Hauptwarteschlange gleichbedeutend sein mit dem Ausführen aus dem Hauptthread, aber offensichtlich nicht.

Kennen Sie eine Workaround?

+0

tut Einwickeln, dass in einem 'SCNTransaction' helfen? (Dauer auf 0 setzen, begin, commit) – mnuages

Antwort

0

von Kommentar

können Sie versuchen, dass in einer Transaktion zu wickeln:

[SCNTransaction begin]; 
[SCNTransaction setAnimationDuration:0]; 
... 
[SCNTransaction commit]; 
+0

danke !!!!!!!!! – SpaceDog