碰撞不在物品之间工作

我在我的应用程序中使用UIDynamics。 我的应用程序有两个方块。 一个是固定的,另一个可以移动(通过应用平移手势)。 当我尝试碰撞他们时,他们不会碰撞。 委托方法永远不会被调用。 这里是我的代码,我希望有人能指出这个问题。

UIDynamicAnimator* animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; UICollisionBehavior* collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.square1, self.square2]]; collisionBehavior.translatesReferenceBoundsIntoBoundary = YES; UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; [self.square1 addGestureRecognizer:pan]; [collisionBehavior setCollisionMode:UICollisionBehaviorModeEverything]; [animator addBehavior:collisionBehavior]; collisionBehavior.collisionDelegate = self; 

  1. 使animation作为属性或实例variables。 否则视图加载后会被清除。
  2. 确保实现了UICollisionBehaviorDelegate协议和对应的方法

这是我的基于你的代码的作品实现。

接口:

 #import <UIKit/UIKit.h> @interface DynamicViewController : UIViewController<UICollisionBehaviorDelegate> @property (strong, nonatomic) UIDynamicAnimator *animator; @property (strong, nonatomic) UIPushBehavior *pushBehavior; @end 

执行:

 @synthesize pushBehavior = _pushBehavior; @synthesize animator = _animator; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { } return self; } - (void)viewDidLoad { [super viewDidLoad]; UIView *square1 = [[UIView alloc] initWithFrame:CGRectMake(100, 30, 30, 30)]; square1.center = CGPointMake(150, 150); square1.backgroundColor = [UIColor greenColor]; UIView *square2 = [[UIView alloc] initWithFrame:CGRectMake(100, 300, 30, 30)]; square2.center = CGPointMake(250, 350); square2.backgroundColor = [UIColor redColor]; [self.view addSubview:square1]; [self.view addSubview:square2]; _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; UICollisionBehavior* collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[square1, square2]]; collisionBehavior.translatesReferenceBoundsIntoBoundary = YES; [collisionBehavior setCollisionMode:UICollisionBehaviorModeEverything]; collisionBehavior.collisionDelegate = self; [_animator addBehavior:collisionBehavior]; UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; [square1 addGestureRecognizer:pan]; } #pragma mark push behavior - (void)handlePan:(UIPanGestureRecognizer *)gesture { if(gesture.state == UIGestureRecognizerStateBegan){ if (_pushBehavior) { [_animator removeBehavior:_pushBehavior]; } _pushBehavior = [[UIPushBehavior alloc] initWithItems:@[gesture.view] mode:UIPushBehaviorModeContinuous]; [_animator addBehavior:_pushBehavior]; } CGPoint offset =[gesture translationInView:self.view]; _pushBehavior.pushDirection = CGVectorMake(offset.x,offset.y); _pushBehavior.magnitude = sqrtf(offset.x * offset.x + offset.y * offset.y) / 50; if (gesture.state == UIGestureRecognizerStateEnded) { [_animator removeBehavior:_pushBehavior]; _pushBehavior = nil; } } #pragma mark Colision delegate - (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p; { NSLog(@"Colision Began"); } - (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2; { NSLog(@"Colision End"); } 

由于ARC,function结束时,您的UIDynamicAnimator * animator将被销毁。 这就是为什么你无法看到任何animation。 把它作为一个实例variables,你会没事的。

我认为UIDynamics有一些问题(但不是100%肯定让我知道,如果我错了)。 直到我为UIDynamicAnimator和UIGravityBehavior创build了实例variables之后,我才做出dynamic的工作。 尝试将类实例variables添加到扩展名为.m的文件中,如下所示:

 UIDynamicAnimator* animator; UICollisionBehavior* collisionBehavior; 

并将您的前两行代码更改为:

 animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.square1, self.square2]]; 

它应该帮助。

您必须使用“addBoundaryWithIdentifier”指定碰撞类别的边界,并从碰撞类别中移除不移动的项目