ios - 项目之间的碰撞不起作用

标签 ios objective-c uikit-dynamics uicollisionbehavior

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

    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. 将 animator 作为属性或实例变量。否则它会 在 View 加载后被清除。
  2. 确保实现了 UICollisionBehaviorDelegate 协议(protocol)和相应的方法

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

接口(interface):

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

关于ios - 项目之间的碰撞不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20769593/

相关文章:

ios - UIDynamicAnimator项目(in :)在iOS 11中崩溃

ios - 奇怪的 SpriteKit + UIDynamics 错误

iphone - 在 Objective-C iOS iPhone 等中将英国邮政编码转换为 Lat/Lng

ios - NSNotificationCenter 的帖子导致 "EXC_BAD_ACCESS"异常

ios - 未调用 UIAlertView 子类中的 alertViewShouldEnableFirstOtherButton

ios - 无法在 AFNetworking 中获取下载进度

objective-c - ( objective-c )做@synthesize myvar = _myvar(如果有的话)有什么好处?

ios - UIKit 动态 : Attachment inside UITableViewCell

ios - 无法将 ZXingObjC 集成到 iOS Swift 项目中

ios - Xcode 6 beta 7 中 println() 上的线程 1 : EXC_BAD_ACCESS (code=1, 地址=0x0)