1

我正在尝试使用动画更改视图的框架。我想知道动画期间的帧。这是我正在做的事情:

[_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;

没有按预期工作。

只是想确定这是否可能,如果是,而不是如何。

谢谢。

4

2 回答 2

1

您将不得不使用计时器。在计时器事件处理程序中执行此操作

-(void)timerHandler:(NSTimer *)timer {

  CGRect frame = [_tempView.layer.presentationLayer frame]; 

}
于 2013-09-27T19:53:10.887 回答
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
于 2013-09-27T15:08:23.093 回答