目标是创建一个环境,使球的图像在视图中非常缓慢地内不断反弹。我可以使无尽的跳动以较高的速度工作,但不能以缓慢的速度工作。
这是代码示例:
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,球应该永远弹跳,不是吗?
最佳答案
请记住,UIKIt Dynamics不是物理学。苹果公司在WWDC上反复说了这一点。这是“类似于物理学的”。UICollisionBehavior
会抑制小于100p / s的矢量分量(未记录;您可以通过实验来解决)。这通常是您想要的,因此事情不会永远反弹,并且使一些常见用法更易于实现。 UIDynamicItemBehavior
没有真正融入我的经验中。它并没有定义项目的真正“基本”特征。它只是以一种类似于物理学的方式来调整其他行为。
UIKit Dynamics还具有各种舍入错误,当您推动float
可以容纳的内容时,它们会使项目以不理想的方式运行。 UIKit Dynamics的目的是在UIView
中加入一些弹跳,而不是模拟实际的物理交互。
我不是在说UIKit Dynamics是正确的。我发现使用它具有挑战性,并且通常会以这种非显而易见的方式表现出来。如果您需要更像物理学的东西,则可以改用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];
}
关于ios - UIKit Dynamics-缓慢移动的对象不会反弹,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19798050/