2016-04-24 114 views
1

我试图确定一个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); 

}); 

问题是,这个块是从一个调度块调用的,所以我需要重新调度它到主队列,但这样做会阻止代码工作。理论上,将一个块分派给主队列应该等同于从主线程运行它,但显然它不是。

你们知道任何解决方法吗?

+0

做包装,在一个'SCNTransaction'帮助吗? (设置持续时间为0,开始,提交) – mnuages

回答

0

从评论

你可以试着来包装在一个交易:

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

谢谢!!!!!!!!! – SpaceDog