场景:当UIView正在做动画时,实时如何获取UIView的frame?
对策:
每个 CALayer 有一个 presentationLayer 属性,当CAAnimation发生时,你在屏幕上看到的实际上是 presentation layer 的改变。如果你访问 presentation layer,QuartzCore 将会计算现有的帧状态,并且使用这个帧状态去构建 presentation layer 对象。因为动画状态在动画执行期间一直处于改变,因此你将会获得近似值。
presentationLayer 和 NSTimer 结合使用就可以满足前面需求
下面是demo:
- (void)viewDidLoad {
[superviewDidLoad];
self.imageView= [[UIViewalloc]init];
self.imageView.backgroundColor= [UIColorredColor];
self.imageView.frame=CGRectMake(100,100,100,150);
[self.viewaddSubview:self.imageView];
NSTimer*timer = [NSTimertimerWithTimeInterval:0.1target:selfselector:@selector(currentRect:)userInfo:nilrepeats:YES];
[[NSRunLoopcurrentRunLoop]addTimer:timerforMode:NSDefaultRunLoopMode];
[UIViewanimateWithDuration:5.0animations:^{
self.imageView.center=CGPointMake(200,300);
}];
}
-(void)currentRect:(NSTimer*)timer
{
CGRectimageViewCurrentRect = [[self.imageView.layerpresentationLayer]frame];
NSLog(@"x: %lf, y:%lf",imageViewCurrentRect.origin.x,imageViewCurrentRect.origin.y);
}
网友评论