2014-12-22 5 views
2

У меня есть UIImageView путешествие на UIBezierPath:UIImageView анимации на UIBezierPath не обнаруживает столкновение

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIBezierPath *path = [UIBezierPath bezierPath]; 
    [path moveToPoint:CGPointMake(60, 60)]; 
    [path addLineToPoint:CGPointMake(70, 70)]; 
    [path addLineToPoint:CGPointMake(80, 120)]; 

    [self.thingy setImage:[UIImage imageNamed:@"titles.png"]]; 
    [self.thingy.layer setPosition:CGPointMake(60, 60)]; 
    [self.view.layer addSublayer:self.thingy.layer]; 

    CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
    anim.path = path.CGPath; 
    anim.rotationMode = kCAAnimationRotateAuto; 
    anim.duration = 8.0; 
    [self.thingy.layer addAnimation:anim forKey:@"move"]; 

    self.timer = [NSTimer scheduledTimerWithTimeInterval:1 
                target:self 
               selector:@selector(tester) 
               userInfo:nil 
               repeats:YES]; 
} 

Цель: Я хочу, чтобы обнаружить, является ли thingy сталкивается с barrier. Вот tester:

- (void) tester { 
    NSLog(@"calling method"); 
    if (CGRectIntersectsRect(self.thingy.frame, self.barrier.frame)) { 
     NSLog(@"collided"); 
    } 
} 

barrier и thingy оба UIImageViews объявлены как weak и nonatomic в файле заголовка.

Проблема: tester всегда вызывается каждую секунду, но когда два столкновений не происходят, ничего не происходит. Любая помощь, чтобы попытаться сделать эту работу?

ответ

1

Поскольку thingy анимируется, вы не получите точных значений из его кадра. Если я правильно помню, как только анимация начнется, представление сразу же получит окончательный кадр с конца анимации. Если вы хотите протестировать кадр thingy во время его движения, вам нужно проверить рамку презентационного слоя слоя thingy. Что-то вроде этого:

- (void) tester { 
    NSLog(@"calling method"); 

    if (CGRectIntersectsRect(((CALayer *)[self.thingy.layer presentationLayer]).frame, self.barrier.frame)) { 
     NSLog(@"collided"); 
    } 
} 

Примечание: Если барьер находится в движении тоже, вы должны будете использовать его представительский уровень, а также.