首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIKit动力学-慢速运动的物体不会反弹

UIKit动力学-慢速运动的物体不会反弹
EN

Stack Overflow用户
提问于 2013-11-05 20:14:11
回答 2查看 3.2K关注 0票数 2

我们的目标是创建一个环境,在这个环境中,一个球的图像将在视图中无休止地反弹,非常缓慢的。我可以让无止尽的弹跳工作在一个高速,但不是一个缓慢的速度。

下面是代码的示例:

代码语言:javascript
复制
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,球应该永远弹跳,不是吗?

EN

回答 2

Stack Overflow用户

发布于 2013-11-06 15:01:28

请记住,UIKIt动力学不是物理。苹果公司在WWDC上反复强调了这一点。就像“物理一样”

UICollisionBehavior会抑制小于100 p/s的向量组件(这还没有文档化;您可以通过实验来计算)。这通常是您想要的,这样事情就不会永远跳起来,并且使一些常见的用途更容易实现。在我的经验中,UIDynamicItemBehavior并没有真正深入地集成。它没有定义项目的真正“基本”特征,它只是以类似物理的方式调整其他行为。

UIKit动力学还存在各种舍入错误,当您推动float所能容纳的东西的边缘时,这些错误会使项目以非理想的方式运行。UIKit动力学的目的是在UIView中加入一些弹跳,而不是模拟真实的物理交互。

我并不是说UIKit动力公司在这方面的做法是正确的。我发现和它一起工作是很有挑战性的,而且它经常以这样的不明显的方式表现。如果你需要一些更像物理的东西,你可能想要去探索SpriteKit。如果这个问题影响到你,我建议打开雷达(bugreport.apple.com)。

您可以自己尝试使用一个更简单的实现:

代码语言:javascript
复制
- (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];
}
票数 5
EN

Stack Overflow用户

发布于 2016-10-05 12:22:23

这可能对你的用例不起作用,但它适用于我的用例,因为我不希望我的物品在它们慢下来的时候粘在一起。

我添加了一个委托来检测碰撞发生的时间,并在冲突相反的方向上对每个项目添加了一个小的推送,这样项目就不会粘在一起了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19798050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档