我正在尝试使用动画更改视图的框架。我想知道动画期间的帧。这就是我在做的事情:
[_viewTemp addObserver:self forKeyPath:@"frame" options:0 context:NULL];
[UIView animateWithDuration:1.0 animations:^{
CGRect frame = _viewTemp.frame;
frame.origin.x += 100;
_viewTemp.frame = frame;
}];
这里_viewTemp
是我的UIView类对象。我想在动画工作时改变每一帧。
喜欢:
当前原点是{10,10}动画合并后它将是{110,10}。我想要像{11,10},{12,10}这样的每一帧变化都要回调。
我不知道这是否可行。使用KVO我只能收到一次回叫。甚至通过创建子类并处理
- (void)setFrame:(CGRect)frame;
没有按预期工作。
只是想确定这是否可行,如果是,则确定如何。
感谢。
答案 0 :(得分:1)
您必须使用计时器。在timer事件处理程序中执行此操作
-(void)timerHandler:(NSTimer *)timer {
CGRect frame = [_tempView.layer.presentationLayer frame];
}
答案 1 :(得分:0)
使用:
#define kRight YES
#define kLeft NO;
@interface ViewController ()
{
bool _moveDirection;
}
- (void)viewDidLoad
{
[super viewDidLoad];
_moveDirection = kRight;
}
- (IBAction)actionChange:(id)sender {
__block NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:-1 target:self selector:@selector(handleAnimationTimer:) userInfo:nil repeats:YES];
[UIView animateWithDuration:1.0 animations:^{
CGRect frame = self.outletLabel.frame;
if(_moveDirection == kRight) {
_moveDirection = kLeft;
frame.origin.x += 100;
} else {
_moveDirection = kRight;
frame.origin.x -= 100;
}
self.outletLabel.frame = frame;
} completion:^(BOOL finished) {
// Remove timer
[timer invalidate];
timer = nil;
}];
}
-(void)handleAnimationTimer:(NSTimer *)timer{
CGRect frame = self.outletLabel.frame;
NSLog(@"frame X %.00f", frame.origin.x);
}
您将能够看到 Frame在动画期间不更改 - 它仅在开头设置动画。
我建议您滚动自己的帧动画(使用上面显示的预定定时器)并在每次调用期间调整帧
handleAnimationTimer:(NSTimer *)timer