4

使用时总是崩溃UIKit Dynamics。并非每次代码运行时都会发生这种情况,但会经常发生。有没有人遇到过这个?

Assertion failed: (a.x >= 0.0f && a.y >= 0.0f), 
function SolveVelocityConstraints, file 
/SourceCache/PhysicsKit/PhysicsKit-
4.6/PhysicsKit/Box2D/Dynamics/Contacts/b2ContactSolver.cpp, line 422.

这是生成错误的代码。我它与碰撞边界有关。

UIDynamicAnimator *animator = 
 [[UIDynamicAnimator alloc] initWithReferenceView:self];

UIGravityBehavior *gravityBehavior = 
 [[UIGravityBehavior alloc] initWithItems:@[self.rewardButton]];
gravityBehavior.gravityDirection = CGVectorMake(0.0, 1.0);
gravityBehavior.magnitude = 1.0f;

UICollisionBehavior* collisionBehavior = 
 [[UICollisionBehavior alloc] initWithItems:@[self.rewardButton, 
                                              self.processingView]];
collisionBehavior.collisionDelegate = self;
UIEdgeInsets insets = UIEdgeInsetsMake(-700, 60, 200, 60);
[collisionBehavior setTranslatesReferenceBoundsIntoBoundaryWithInsets:insets];

UIDynamicItemBehavior* propertiesBehavior = 
 [[UIDynamicItemBehavior alloc] initWithItems:@[self.rewardButton]];
float elasticity = arc4random() % 4 * 0.1 + 0.1f;
propertiesBehavior.elasticity = elasticity;

[animator addBehavior:propertiesBehavior];
[animator addBehavior:gravityBehavior];
[animator addBehavior:collisionBehavior];

self.animator = animator;
4

2 回答 2

1

似乎对我有用的一个技巧是为 UIDynamicItemBehavior 设置一个非常大的密度量。使用 1 或 2 的密度仍然会给我错误,但 500 似乎没有。就像我说的,它很老套,但是在我非常有限的测试中,它似乎可以解决问题。

UIDynamicItemBehavior *itemBehavior = 
 [[UIDynamicItemBehavior alloc] initWithItems:self.items];
[itemBehavior setDensity:500.0f];
[self.animator itemBehavior];

感谢 KillerRhino 的评论和他链接的 Box2D 线程,引导我走上这条将项目质量视为问题的道路。根据UIDynamicItemBehavior 文档,密度及其大小决定了质量。希望这种解决方法在其他条件/设置下也能成立。

认为这个问题只发生在配备新 A7 芯片的新设备上(iPhone 5s、iPad Air、iPad Mini Retina)。也许是64位问题?

于 2013-11-27T06:41:08.270 回答
0

我有完全相同的崩溃。我通过增加我的精灵上的physicsBody 对象的质量来解决它。它们非常小,例如 0.05。将它们增加到 50(因此将所有值乘以 1,000),这使得碰撞器停止了。当然,您必须更改一些其他属性以使物理效果看起来与增加质量之前相同。

于 2013-12-13T04:04:30.827 回答