2013-03-28 14 views
6

Wykonałem animację, która porusza się po ekranie, moja animacja ciągle się pętli. Jak zatrzymać animację po dotknięciu animowanego obrazu, Pozwolić animacji kontynuować po podniesieniu dotyku?Zatrzymaj i rozpocznij animację dotykiem. Cel C

wiem jak używać TouchesMoved przenieść określoną przycisk tak:

CGPoint point = [[[event allTouches] anyObject] locationInView:self.view]; 
UIControl *control = sender; 
control.center = point; 

Ale coraz go do pracy z moim animacji. Chciałbym, aby animacja była kontynuowana po jej dotknięciu.

SelectedCellViewController.h

// SelectedCellViewController.h 

#import <Accounts/Accounts.h> 
#import <QuartzCore/QuartzCore.h> 

@interface SelectedCellViewController : UIViewController { 
IBOutlet UIImageView *imageView; 
UIImageView *rocket; 
} 

@end 

viewControllertoShow.m

#import "SelectedCellViewController.h" 

@interface SelectedCellViewController() 

@end 

@implementation SelectedCellViewController 


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
} 
return self; 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad { 

[super viewDidLoad]; 

[self performSelector:@selector(imageSpawn:) withObject:nil afterDelay:3]; 

} 

- (void) imageSpawn:(id) sender 
{ 

UIImage* image = [UIImage imageNamed:@"ae"]; 
rocket = [[UIImageView alloc] initWithImage:image]; 
rocket.frame = CGRectMake(-25, 200, 25, 40); 
[UIView animateWithDuration:5 
         delay:0.2f 
        options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse 
       animations:^(){rocket.frame=CGRectMake(345, 200, 25, 40);} 
       completion:^(BOOL fin) { 
       }]; 

[self.view addSubview:rocket]; 
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(ballTapped:)]; 
tapped.numberOfTapsRequired = 1; 
[rocket addGestureRecognizer:tapped]; 
[rocket setUserInteractionEnabled:YES]; 


} 

-(void)ballTapped:(UIGestureRecognizer *)gesture 
{ 
CGPoint location = [gesture locationInView:gesture.view]; 

//then write code to remove the animation 
[self.view.layer removeAllAnimations]; 
NSLog(@"Tag = %d", gesture.view.tag); 
rocket.frame = CGRectMake(location.x,location.y,25,40); 
} 

- (void)dismissView { 
[self dismissViewControllerAnimated:YES completion:NULL]; 
} 

- (void)viewDidUnload { 

} 

@end 
+0

Wyświetl moją zaktualizowaną odpowiedź i daj mi znać, czy to pomaga –

+0

Więc zaktualizowałem swój kod. Wyjąłem całkowicie mój myScrollView, teraz nawet mój log dla zdarzenia dotykowego nie działa.Moje zdjęcie jest prawidłowo animowane. ale nie dostaję żadnego wydarzenia dotykowego? –

+0

@MicRO, więc zaktualizowałem swój kod –

Odpowiedz

3

Jak już zaznaczono w swoim pytaniu, można uzyskać dotknięty punkt za pomocą

CGPoint point = [[[event allTouches] anyObject] locationInView:self.view]; 

Następnie sprawdź czek czy ten punkt znajduje się we współrzędnych animowanego UIImageview, a następnie zatrzymaj animację. Ale jeśli używasz widoku przewijania, nie będziesz mógł go użyć, ponieważ przewijanie nie zwróci żadnych zdarzeń dotyku UIView.

W widoku obrazu jest animowanie, lepszym wyborem będzie dodanie UITapGestureRecogniser do widoku obrazu podczas dodawania go s podrzędny, jak to

- (void) imageSpawn:(id) sender 
{ 

UIImage* image = [UIImage imageNamed:@"ae"]; 
UIImageView *rocket = [[UIImageView alloc] initWithImage:image]; 
rocket.frame = CGRectMake(-25, 200, 25, 40); 
[UIView animateWithDuration:5 
         delay:0.2f 
        options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse 
       animations:^(){rocket.frame=CGRectMake(345, 200, 25, 40);} 
       completion:^(BOOL fin) { 
       }]; 

[myScrollView addSubview:rocket]; 
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(ballTapped:)]; 
    tapped.numberOfTapsRequired = 1; 
    [self.rocket addGestureRecognizer:tapped]; 
    [rocket setUserInteractionEnabled:YES]; 
} 

I w kodzie zapisu funkcja celu, aby zatrzymać animację :

-(void)ballTapped:(UIGestureRecognizer *)gesture 
    { 
    //here also you can get the tapped point if you need 
     CGPoint location = [gesture locationInView:gesture.view]; 

    //then write code to remove the animation 
     [self.view.layer removeAllAnimations]; 
    } 

EDIT:

Jeśli próbujesz zatrzymać widoku obrazu na tou Ched punkt, można dodać do tego wydarzenia ballTapped:

rocket.frame = CGRectMake(location.x,location.y,25,40); 

Ale do tego trzeba zadeklarować UIImageView *rocket poza tą konkretną metodą, czyli zadeklarować w pliku nagłówka.

+0

Próbowałem tego. Animacja działa, ale nic się nie dzieje po dotknięciu animowanego obrazu na ekranie. Brak błędów, aplikacja nie ulega awarii? –

+0

jeśli używam [myScrollView addGestureRecognizer: stuknięty]; zamiast [rocket addGestureRecognizer: stuknięty]; działa na całym widoku, mój NSLog (@ "Tag =% d", gest.view.tag); działa, ale to nie działa [self.view.layer removeAllAnimations] ;? –

+0

cóż, nie jestem pewien, co się dzieje w twoim kodzie, czy możesz udostępnić jakiś kod, dzięki czemu mogę mieć lepszy wygląd? –

0

Spróbuj tak, może to ci pomóc, w środku animacji, jeśli dotkniesz obrazu, animacja zniknie z widoku.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint lastLocation = [touch locationInView: self.view]; 

    if([[touch view] isKindOfClass:[UIImageView class]]){ 
     [youImageView.layer removeAllAnimations]; 
     youImageView.center=lastLocation;//assign your image view center when the animation removes from the view. 
    } 
} 

i dodać ramy #import <QuartzCore/QuartzCore.h>.

+0

@Blake Loizides: raz sprawdź ten. – Balu

1

Innym sposobem jest dodanie do tego widoku macierzystego animacji -

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    self.animating = NO; 
    return [super hitTest:point withEvent:event]; 
} 

Użyć (atomowa) nieruchomości, a następnie sprawdzić właściwość w animacji, aby zobaczyć, czy powinien on zostać zatrzymany. Używamy tego, aby zatrzymać galerię zdjęć, która jest uruchomiona, aby użytkownik mógł ręcznie przenosić zdjęcia. Możesz również sprawdzić tutaj, czy punkt znajduje się w określonym obszarze, jeśli to konieczne. Ta metoda jest uruchamiana przed wywołaniem jakichkolwiek metod dotyku.