我们的目标是创建一个环境,在这个环境中,一个球的图像将在视图中无休止地反弹,非常缓慢的。我可以让无止尽的弹跳工作在一个高速,但不是一个缓慢的速度。
下面是代码的示例:
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView: self.view];
UICollisionBehavior *ballCollision = [[UICollisionBehavior alloc] initWithItems: @[largeBall, mediumBall, smallBall]];
[ballCollision setTranslatesReferenceBoundsIntoBoundary: YES];
[ballCollision setCollisionMode: UICollisionBehaviorModeBoundaries];
float force = 0.1;
int angle = 225;
NSNumber *rad = [NSNumber numberWithDouble: DEGREES_TO_RADIANS(angle)];
UIPushBehavior *smallPush = [[UIPushBehavior alloc] initWithItems: @[smallBall] mode: UIPushBehaviorModeInstantaneous];
[smallPush setAngle: [rad floatValue]];
[smallPush setMagnitude: force];
UIDynamicItemBehavior *dynamicBehavior = [[UIDynamicItemBehavior alloc] initWithItems: @[smallBall]];
[dynamicBehavior setDensity: 0.0];
[dynamicBehavior setElasticity: 1.0];
[dynamicBehavior setFriction: 0.0];
[dynamicBehavior setResistance: 0.0];
[animator addBehavior: ballCollision];
[animator addBehavior: smallPush];
[animator addBehavior: dynamicBehavior];我的高中物理课肯定没有陷进去,因为我搞不懂为什么这不管用。摩擦力是零,弹性是1,球应该永远弹跳,不是吗?
发布于 2013-11-06 15:01:28
请记住,UIKIt动力学不是物理。苹果公司在WWDC上反复强调了这一点。就像“物理一样”
UICollisionBehavior会抑制小于100 p/s的向量组件(这还没有文档化;您可以通过实验来计算)。这通常是您想要的,这样事情就不会永远跳起来,并且使一些常见的用途更容易实现。在我的经验中,UIDynamicItemBehavior并没有真正深入地集成。它没有定义项目的真正“基本”特征,它只是以类似物理的方式调整其他行为。
UIKit动力学还存在各种舍入错误,当您推动float所能容纳的东西的边缘时,这些错误会使项目以非理想的方式运行。UIKit动力学的目的是在UIView中加入一些弹跳,而不是模拟真实的物理交互。
我并不是说UIKit动力公司在这方面的做法是正确的。我发现和它一起工作是很有挑战性的,而且它经常以这样的不明显的方式表现。如果你需要一些更像物理的东西,你可能想要去探索SpriteKit。如果这个问题影响到你,我建议打开雷达(bugreport.apple.com)。
您可以自己尝试使用一个更简单的实现:
- (void)viewDidLoad {
// Variables to play with
CGFloat force = .25; // At .25, will bounce forever.
CGFloat angle = 0; // Play with small values to see effect.
[super viewDidLoad];
UIView *ball = [[UIView alloc] initWithFrame:CGRectMake(400, 300, 50, 50)];
ball.backgroundColor = [UIColor greenColor];
[self.view addSubview:ball];
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView: self.view];
UICollisionBehavior *ballCollision = [[UICollisionBehavior alloc] initWithItems: @[ball]];
[ballCollision setTranslatesReferenceBoundsIntoBoundary:YES];
UIPushBehavior *smallPush = [[UIPushBehavior alloc] initWithItems:@[ball]
mode:UIPushBehaviorModeInstantaneous];
[smallPush setAngle:GetRadiansForDegrees(angle)];
[smallPush setMagnitude: force];
UIDynamicItemBehavior *dynamicBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[ball]];
__weak id weakBehavior = dynamicBehavior;
[dynamicBehavior setElasticity: 1];
[dynamicBehavior setResistance: 0.0];
dynamicBehavior.action = ^{
NSLog(@"linear:%@", NSStringFromCGPoint([weakBehavior linearVelocityForItem:ball]));
};
[self.animator addBehavior: ballCollision];
[self.animator addBehavior: smallPush];
[self.animator addBehavior: dynamicBehavior];
}发布于 2016-10-05 12:22:23
这可能对你的用例不起作用,但它适用于我的用例,因为我不希望我的物品在它们慢下来的时候粘在一起。
我添加了一个委托来检测碰撞发生的时间,并在冲突相反的方向上对每个项目添加了一个小的推送,这样项目就不会粘在一起了。
https://stackoverflow.com/questions/19798050
复制相似问题