5

我已经使用这个优秀的教程来启动一个我正在从事的涉及物理学的小项目:

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 经验的人来回答为什么会发生这种情况?

4

1 回答 1

5

与 不同UIViewsCALayers具有内置的隐式动画。每次更改可动画属性的值时,都会引入一个简短的动画。您必须将代码包装起来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];
于 2012-08-16T19:15:42.757 回答