2010-12-09 53 views
2

我想獲取視圖的位置,並且它正在進行動畫並從一個位置移動到另一個位置 我嘗試使用presentationLayer獲取動作位置信息 並試圖在UIView移動時打印出位置。爲什麼視圖的presentationLayer對我無法正常工作?

這裏是正在打印:

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}

通知的箭頭,該端點被直接打印出來,而不顯示路徑上的點。誰能幫忙?

下面

是我的代碼:

下面是它是如何印刷:

-(void)print

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

我用了一個定時器可重複打印出來的動畫視圖 「炸彈」

-(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;  

}

這是它的動畫: -(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); 

}

當我點擊時,「炸彈」會移動,打印出的信息應該逐漸改變。因爲它在10秒內以如此低的速度移動。

它移動正常,但打印不正確。

回答

0

這可能是因爲您正在使用NSTimer打印診斷。這將執行,但可能不在main線程上,從而給你不正確的結果。

您可以使用一個計時器,但它會啓動一個方法,然後調用另一個方法來執行診斷。後者將使用performSelectorOnMainThreadmain線程上執行。

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

             target: self 

              selector: @selector(timedPrint) 

              userInfo: nil 

              repeats: YES]; 

然後:

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

或者,不用使用該currentRunLoop使用mainRunLoop

如果這樣不能解決查詢,那麼可能是因爲Core Animation架構中有三個不同的層;模型,演示文稿和渲染。所以它可能是渲染層已經改變 - 你可以看到 - 但presentationLayer尚未更新。

在這個問題上有相當多的相關問題。例如:

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?

相關問題