物品之间的碰撞不起作用

时间:2013-12-25 06:09:28

标签: ios objective-c uikit-dynamics uicollisionbehavior

我在我的应用中使用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;

4 个答案:

答案 0 :(得分:1)

  1. 将动画制作为属性或实例变量。否则会 在查看加载后清除。
  2. 确保实施UICollisionBehaviorDelegate protol并对应方法
  3. 这是我的工作实现基于您的代码。

    接口:

    #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");
    }
    

答案 1 :(得分:1)

当功能因ARC而结束时,您的UIDynamicAnimator *动画师将被销毁。这就是为什么你无法看到任何动画。使它成为一个实例变量,你会没事的。

答案 2 :(得分:0)

我认为UIDynamics存在一些错误(但不是100%肯定让我知道我是不是错了)。 在为UIDynamicAnimator和UIGravityBehavior创建实例变量之前,我无法完成动态工作。 尝试将类实例变量添加到类扩展名中的.m文件中:

UIDynamicAnimator* animator;
UICollisionBehavior* collisionBehavior;

将前两行代码更改为:

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

应该有所帮助。

答案 3 :(得分:0)

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