Ios 将Box2D物理应用于UIView vs.CALayer

Ios 将Box2D物理应用于UIView vs.CALayer,ios,uiview,uikit,box2d,calayer,Ios,Uiview,Uikit,Box2d,Calayer,我用这本优秀的教程开始了一个涉及物理学的小项目: 基本上,它创建了一个世界,并将B2D的物理应用于您拥有的任何视图。非常简单,而且很有效。但是,我尝试通过使用CALayers应用相同的逻辑,即,我以编程方式创建层,将它们添加到main view.layer并尝试设置它们的动画 创建图层的示例代码: CALayer *layer = [CALayer layer]; layer.backgroundColor = [UIColor blackColor].CGColor; layer.frame

我用这本优秀的教程开始了一个涉及物理学的小项目:

基本上,它创建了一个世界,并将B2D的物理应用于您拥有的任何视图。非常简单,而且很有效。但是,我尝试通过使用CALayers应用相同的逻辑,即,我以编程方式创建层,将它们添加到main view.layer并尝试设置它们的动画

创建图层的示例代码:

CALayer *layer = [CALayer layer];
layer.backgroundColor = [UIColor blackColor].CGColor;
layer.frame = CGRectMake(50, 100, 30, 30);
layer.name = @"square";
[self.view.layer addSublayer:layer];
以及股票行情中的应用物理学:

CALayer *oneLayer = (CALayer *)b->GetUserData();
// y Position subtracted because of flipped coordinate system
CGPoint newCenter = CGPointMake(b->GetPosition().x * PTM_RATIO, self.view.bounds.size.height - b->GetPosition().y * PTM_RATIO);
oneLayer.position = newCenter;
CGAffineTransform transform = CGAffineTransformMakeRotation(- b->GetAngle());
oneLayer.affineTransform = transform;
注意,我将仿射变换调用改编为CALayer类


我反复检查了变量,数字似乎匹配。我从CALayer动画中得到了一个奇怪的反弹,从UIView中得到了一个完美的动画。任何有Box2D和UIKit经验的人都可以回答为什么会发生这种情况?

UIView
不同,
CALayers
具有内置的隐式动画。每次更改可设置动画的特性的值时,都会引入一个短动画。您必须将代码包装在
CATransaction
中,并禁用操作以消除此影响:

[CATransaction begin];
[CATransaction setDisableActions:YES]; // implicit animations get disabled

CALayer *oneLayer = (CALayer *)b->GetUserData();
// y Position subtracted because of flipped coordinate system
CGPoint newCenter = CGPointMake(b->GetPosition().x * PTM_RATIO, self.view.bounds.size.height - b->GetPosition().y * PTM_RATIO);
oneLayer.position = newCenter;
CGAffineTransform transform = CGAffineTransformMakeRotation(- b->GetAngle());
oneLayer.affineTransform = transform;

[CATransaction commit];
你能解释一下“奇怪的反弹”吗:-黑色是CALayer,绿色是UIView。CALayer在撞到“地面”之前会反弹。一个原因使我认为尺寸等是正确的,是因为在框架底部接触地面的情况下,CALayer最终停止反弹。