SCNText getBoundingBoxMin:max: всегда ноль
Я пытаюсь определить ограничивающую рамку SCNText
но getBoundingBoxMin:max:
всегда дает мне ноль.
Это код, который работает внутри SCNText
расширение класса, так self
это [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);
Я также попробовал это
[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
всегда ноль.
ПРИМЕЧАНИЕ: я обнаружил, почему проблема возникает.
Проблема возникает, когда эта настройка вызывается внутри блока следующим образом:
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);
но если я вызову это из другого потока, это не будет работать
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);
});
проблема заключается в том, что этот блок вызывается из блока отправки, поэтому мне нужно повторно отправить его в основную очередь, но в этом случае код не работает. В теории отправка блока в основную очередь должна быть эквивалентна запуску его из основного потока, но, очевидно, это не так.
Ребята, вы знаете какой-нибудь обходной путь?
1 ответ
из комментария
Вы можете попытаться обернуть это в транзакции:
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0];
...
[SCNTransaction commit];