繁体   English   中英

未在UIView动画中调用Completion ^块

[英]Completion^ block not being called in UIView animation

我在这里想念什么吗? 我希望imageview滑入,然后从屏幕底部滑出。

此外,这似乎将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;
        }];
    }
}];

用来初始化_finga会将其放在导航栏下面。 在动画中,您正在将框架设置为视图的边界,这会将其置于条形后面,因为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);

这会将视图置于导航栏的正下方。 还考虑将所有硬编码的88s替换为变量或#define这样您就可以更轻松地使用它,以防导航栏高度发生变化。

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

但是,通常,如果您仅使用完成块在第一个动画之后运行另一个动画,则根本不需要检查已完成的BOOL 仅当程序中的其他内容取决于动画的状态时,这才至关重要。 例如,用户可以单击将某些内容设置为动画的按钮,然后将用户带到应用程序的其他部分。 但是,如果用户取消动画,则您可能根本不希望转到其他部分,因此可以检查done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM