UIKit动力学"SolveVelocityConstraints"崩溃

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;

我在SpriteKit上遇到了相同的错误,而不是UIDynamics。我曾经在这个Box2D线程上找到了一个答案,它建议将物体的质量设置为默认值可以解决Assertion失败,但事实并非如此。我想分享一下。 - kvn
我在使用UIKit Dynamics时遇到了相同的崩溃问题,但这只发生在我的iPad(mini retina iOS 7.0.4)上,而从未发生在我的iPhone(5 iOS 7.0.4)上。您也是在iPad上特定情况下出现崩溃吗? - Brandon
此外,只有在使用 UICollisionBehaviorModeEverything 的 UICollisionBehavior 碰撞模式时才会出现。我尝试过使用 UICollisionBehaviorModeBoundaries 和 UICollisionBehaviorModeItems,并没有出现崩溃。 - Brandon
这是在我的iPhone上发生的。而且我没有明确设置collisionMode。 - bmueller
bmueller,你用的是iPhone 5s或更早的设备吗?我认为这可能只会在装有A7芯片的新设备上发生(如iPhone 5s、iPad Air和iPad Mini Retina)。至于碰撞模式,UICollisionBehaviorModeEverything是默认设置,所以如果你没有明确设置它,那么很可能就是在使用它。 - Brandon
是的,它在5s上。谢谢提醒,我会尝试更改它。 - bmueller
2个回答

1

一种我个人觉得可行的方法是将UIDynamicItemBehavior的密度设置为非常大的数值。使用1或2的密度仍然会出现错误,但500似乎没有问题。虽然这种方法有点hacky,但在我的极少测试中似乎有效。

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位的问题?

0
我遇到了完全相同的崩溃问题。通过增加精灵物理体对象的质量,我解决了这个问题。它们实际上很小,例如0.05。将它们增加到50(乘以1,000),这样就可以防止崩溃了。当然,您还需要更改其他一些属性才能使物理效果与增加质量之前相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接