SCNText getBoundingBoxMin:max: 始终为零
SCNText getBoundingBoxMin:max: always zero
我正在尝试确定 SCNText
的边界框,但 getBoundingBoxMin:max:
总是给我零。
这是在 SCNText
class 扩展中运行的代码,所以 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);
});
问题是这个块是从调度块调用的,所以我需要将它重新调度到主队列,但这样做会阻止代码工作。从理论上讲,将一个块分派到主队列应该等同于从主线程 运行 它,但显然不是。
你们知道任何解决方法吗?
来自评论
您可以尝试将其包装在交易中:
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0];
...
[SCNTransaction commit];
我正在尝试确定 SCNText
的边界框,但 getBoundingBoxMin:max:
总是给我零。
这是在 SCNText
class 扩展中运行的代码,所以 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);
});
问题是这个块是从调度块调用的,所以我需要将它重新调度到主队列,但这样做会阻止代码工作。从理论上讲,将一个块分派到主队列应该等同于从主线程 运行 它,但显然不是。
你们知道任何解决方法吗?
来自评论
您可以尝试将其包装在交易中:
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0];
...
[SCNTransaction commit];