SCNText getBoundingBoxMin:max:始终为零

时间:2016-04-24 18:36:55

标签: ios iphone scenekit scnnode scntext

我正在尝试确定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 个答案:

答案 0 :(得分:0)

来自评论

您可以尝试将其包装在事务中:

function calculate_product_price( $cart_object ) {
        /* Gift wrap price */
        $additionalPrice = 100;
        foreach ( $cart_object->cart_contents as $key => $value ) {               
            //You can add your condition here
            $quantity = floatval( $value['quantity'] );
            $orgPrice = floatval( $value['data']->price );
            $value['data']->price = ( ( $orgPrice + $additionalPrice ) * $quantity );                   
        }
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_product_price', 1, 1 );