/ / Aktualizujte rámec zobrazenia počas jeho animácie - ios, uiview, core-animation, caanimation, cakeyframeanimation

Aktualizujte rámec zobrazenia počas jeho animácie - ios, uiview, core-animation, caanimation, cakeyframeanimation

Robím takú animáciu:

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.duration = 100.0;
animation.path = self.animationPath.CGPath;
[view.layer addAnimation:animation forKey:@"animation"];

Funguje dobre, teraz to však zlyhá, keď sa pokúšate zistiť dotyky objektu, ktorý sa pohybuje po obrazovke:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
for (UIView* subview in self.subviews ) {
if ( [subview hitTest:[self convertPoint:point toView:subview] withEvent:event] != nil ) {
[self handleTap];
return YES;
}
}
return NO;
}

Zlyhá to, pretože snímkový rámec už nie je rovnaký ako jeho zjavná poloha na obrazovke, keď sa animuje. Ako sa dostanem pointInside pracovať so zobrazením, ktoré sa animuje?

odpovede:

3 pre odpoveď č. 1

Toto je môj kód

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet AnimatableView *animableView;
@end

@implementation ViewController

- (void)animateAlongPath
{
UIBezierPath * path = [UIBezierPath bezierPathWithRect:self.view.frame];

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.duration = 10;
animation.path = path.CGPath;
animation.removedOnCompletion = NO;
animation.fillMode = @"kCAFillModeForwards";
[self.animableView.layer addAnimation:animation forKey:@"animation"];
}

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)animate:(id)sender {
[self animateAlongPath];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView: [touch view]];

CALayer * selectedlayer = (CALayer*)[self.animableView.layer.presentationLayer hitTest:location];
if(selectedlayer != nil)
NSLog(@"touched");
else
NSLog(@"dont touched");
}


@end

Dúfam, že vám to pomôže


2 pre odpoveď č. 2

Krátka odpoveď: Nemôžete „t.V animáciách UIView aj Core Animation sa zobrazenie / vrstva v skutočnosti nepohybuje, pretože sa javí, že sa jej pozícia javí ako animujúca. Namiesto toho existuje „prezentačná vrstva“, ktorá pri pohybe kreslí animovaný objekt.

Ak chcete, aby boli objekty klepnuteľné, kým aanimácia polohy je „za letu“, musíte na rozpoznávanie gest klepnúť na dohľad, ktorý sa rozprestiera na celej ploche, po ktorej bude pohľad prechádzať, a potom otestovať zásah na prezentačnej vrstve objektu, ktorý sa má animovať.

edit:

Mám projekt s názvom Github Ukážka skupiny iOS CAAnimation Group to je pracovná ukážka toho, ako používať testovanie prístupov na prezentačnej vrstve na detekciu klepnutí na pohľad, ktorý sa animuje pozdĺž zložitej cesty.

Kód je napísaný v Objective-C, ale mal bystále bude ilustráciou konceptu a techník. Dajte mi vedieť, ak máte problém s pochopením kódu Objective-C. Som slušný vo Swifte, aj keď stále platím účty väčšinou v Objective-C, takže to je syntax, ktorú poznám najlepšie.