将Box2D物理应用于UIView vs. CALayer

时间:2012-08-16 16:18:45

标签: ios uiview uikit box2d calayer

我已经用这个优秀的教程启动了一个我正在研究涉及物理学的小项目:

http://www.cocoanetics.com/2010/05/physics-101-uikit-app-with-box2d-for-gravity/

基本上,它创造了一个世界,并将B2D的物理特性应用于您拥有的任何视图。很简单,它的工作原理。但是,我试图通过使用CALayers应用相同的逻辑,即,我以编程方式创建图层,将它们添加到主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来回答为什么会发生这种情况?

1 个答案:

答案 0 :(得分:5)

UIViews不同,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];