我正在尝试确定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 :(得分: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 );