2010-12-09 4 views
2

Ich möchte die Position einer Ansicht abrufen, während sie animiert wird und von einer Position zur anderen wechselt Ich habe versucht, die presentationLayer zu verwenden, um die Informationen zum Aktionsort abzurufen und den Standort zu drucken, wenn sich die UIView bewegt . HierWarum funktioniert die PresentationLayer einer Ansicht nicht korrekt für mich?

ist das, was den Ausdruck:

2010-12-08 16:56:50.496 Exp[31219:207] point: NSPoint: {45, 45}

2010-12-08 16:56:50.696 Exp[31219:207] point: NSPoint: {45, 45}

2010-12-08 16:56:50.896 Exp[31219:207] point: NSPoint: {45, 45}

2010-12-08 16:56:51.096 Exp[31219:207] point: NSPoint: {45, 45}

2010-12-08 16:56:51.296 Exp[31219:207] point: NSPoint: {45, 45}

2010-12-08 16:56:51.496 Exp[31219:207] point: NSPoint: {245, 245} <<----------------------------------------

2010-12-08 16:56:51.696 Exp[31219:207] point: NSPoint: {245, 245}

2010-12-08 16:56:51.896 Exp[31219:207] point: NSPoint: {245, 245}

2010-12-08 16:56:52.096 Exp[31219:207] point: NSPoint: {245, 245}

Bekanntmachung der Pfeil wird der Endpunkt direkt ausgedruckt ohne Punkte auf dem Weg zeigt. Kann jemand helfen?

unten ist mein Code:

Hier sind, wie es gedruckt wird:

-(void)print

{ NSLog([NSMutableString stringWithFormat:@"point: %@",[NSValue valueWithCGPoint:((CALayer *)[bomb.layer presentationLayer]).position]]);
}

ich einen Timer verwendet, um immer wieder aus der animierten Ansicht "Bombe"

-(id)initWithCoder:(NSCoder *)aDecoder

{ if (self=[super initWithCoder:aDecoder]) {

 bomb = [[BombView alloc]init]; 
     bomb.frame = CGRectMake(30, 30, 30, 30); 
     bomb.backgroundColor = [UIColor yellowColor]; 

     [self addSubview:bomb]; 

     timer = [NSTimer timerWithTimeInterval:PRINTINTERVAL // defined to be 0.2 

             target: self 

              selector: @selector(print) 

              userInfo: nil 

              repeats: YES];    

     [[NSRunLoop currentRunLoop] addTimer:timer forMode:  NSDefaultRunLoopMode]; 

} 

return self;  

}

drucken

Hier ist, wie es animiert ist: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"position"]; 

animation.duration = 10.0; 

animation.delegate = bomb; 

[bomb.layer addAnimation:animation forKey:@"animatePosition"]; 

bomb.center = CGPointMake(bomb.center.x+200, bomb.center.y+200); 

}

Wenn ich klicke, wird sich die "Bombe" bewegen und die ausgedruckte Information sollte sich allmählich ändern. Weil es sich innerhalb von 10 Sekunden mit so geringer Geschwindigkeit bewegt.

Es bewegt sich gut, druckt aber nicht korrekt.

Antwort

0

Es könnte sein, weil Sie eine NSTimer verwenden, um die Diagnose zu drucken. Das wird ausgeführt, aber vielleicht nicht auf dem main Thread, wodurch Sie falsche Ergebnisse erhalten.

Sie könnten einen Timer verwenden, aber stattdessen eine Methode auslösen, die wiederum eine andere Methode zur Diagnose aufruft. Letzteres wird auf dem main Thread mit performSelectorOnMainThread ausgeführt.

timer = [NSTimer timerWithTimeInterval:PRINTINTERVAL // defined to be 0.2 

             target: self 

              selector: @selector(timedPrint) 

              userInfo: nil 

              repeats: YES]; 

dann:

- (void)timedPrint 
{ 
[self performSelectorOnMainThread:@selector(print)]; 
} 

Alternativ vielmehr, dass die Verwendung der currentRunLoop Verwendung mainRunLoop.

Wenn das die Abfrage nicht auflöst, dann liegt das daran, dass es natürlich drei verschiedene Ebenen in der Core Animation Architektur gibt; Modell, Präsentation und Render. Es kann also sein, dass sich der Render-Layer - wie Sie sehen - geändert hat, aber der presentationLayer wurde noch nicht aktualisiert.

Es gibt einige verwandte Fragen genau zu diesem Thema. Zum Beispiel:

Does the -presentationLayer tell me the in-flight values of an view while it is beeing animated?

Why does one have to use CALayer's presentationLayer for hit-testing?