在UIView动画中没有调用完成^块

时间:2014-04-02 20:15:28

标签: ios animation uiview uiimageview block

这里有什么我想念的吗? 我希望图像视图滑入,然后从屏幕底部滑出。

另外,这似乎将UIImageView置于导航栏后面,如何使CGRect适合导航栏下的屏幕?

_finga = [[UIImageView alloc] initWithFrame:CGRectMake(0, 88, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-88)];
hiddenFrame = CGRectOffset(_finga.frame, 0, _finga.frame.size.height);
_finga.frame = hiddenFrame;
[self.view addSubview:_finga];
_finga.image = [UIImage imageNamed:@"Finga"];
[UIView animateWithDuration:2.0 animations:^{
    _finga.frame = self.view.bounds;
}completion:^(BOOL done) {
    if (done) {
        NSLog(@"Complete!");
        [UIView animateWithDuration:2.0 animations:^{
            _finga.frame = hiddenFrame;
        }];
    }
}];

1 个答案:

答案 0 :(得分:1)

您初始化_finga的CGRect会将其放在导航栏下。在动画中,您将帧设置为视图的边界,这将把它放在条形后面,因为y值将为0.

您可以通过从开头使用此框架初始化_finga来编写更少的代码:

CGRectMake(0,
           self.view.bounds.size.height,
           self.view.bounds.size.width,
           self.view.bounds.size.height-88);

这会将视图从屏幕上移开。然后,在将其添加为子视图并设置其图像后,将视图设置为该框架的动画:

CGRectMake(0,
           88,
           self.view.bounds.size.width,
           self.view.bounds.size.height-88);

将视图放在导航栏下方。考虑使用变量或#define替换所有硬编码的88,以便您可以更轻松地使用它,以防导航条高度发生变化。

对于完成块,请在检查@"Complete!"是否为done之前尝试记录YES字符串,或在其中放置断点并查看done的值是。由于某种原因,您的动画可能无法完成,这可以解释为什么完成块中的代码没有运行。

但一般情况下,如果您只是使用完成块在第一个动画之后运行另一个动画,则根本不需要检查完成BOOL。当程序中的其他内容取决于动画的状态时,它才是至关重要的。例如,用户可以点击动画某事物的按钮,然后将用户带到应用程序的不同部分。但是,如果用户取消动画,您可能根本不想转到其他部分,因此您可以检查done