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?
tut Einwickeln, dass in einem 'SCNTransaction' helfen? (Dauer auf 0 setzen, begin, commit) – mnuages