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];
Другие вопросы по тегам