当UIView正在做动画时,如何获取UIView的frame?
学习是最好的投资!
使用presentationLayer属性可以获取最新frame。Sample:
- (IBAction)move { CGRect destRect = self.frame; destRect.origin.x = 300 - destRect.origin.x; __block BOOL animationComplete = FALSE; [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; [UIView animateWithDuration:0.5f delay:0.0f options:UIViewAnimationCurveEaseInOut animations:^{ [self setFrame:destRect]; } completion:^(BOOL finished) { animationComplete = YES; [[UIApplication sharedApplication] endIgnoringInteractionEvents]; }]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, (unsigned long)NULL), ^{ while (!animationComplete) { dispatch_sync(dispatch_get_main_queue(), ^{ CALayer *layer = self.layer.presentationLayer; CGRect frame = [layer frame]; CGPoint point = [layer position]; float currentTranslation = [[layer valueForKeyPath:@"transform.translation.x"] floatValue]; NSLog(@"%.1f : %.1f : %.1f : %.1f : %.1f : %.1f",frame.origin.x, currentTranslation, frame.origin.x, layer.bounds.origin.x, layer.position.x, point.x); }); } }); }
参考链接
补充:上面Sample的原理是动画开始后,在低优先级子线程中通过presentationLayer来不断获取最新frame,直到动画结束,当然这里你可以使用NSTimer来实现。
使用presentationLayer属性可以获取最新frame。
Sample:
参考链接
补充:
上面Sample的原理是动画开始后,在低优先级子线程中通过presentationLayer来不断获取最新frame,直到动画结束,当然这里你可以使用NSTimer来实现。