我目前关注以下问题:
我开始动画,触发2个物体属性。
代码是:
[UIView animateWithDuration:0.3 animations:^{
greyscaleImage.alpha = 1;
activityIndicator.alpha = 1;
} completion:^(BOOL f){
if(f)
{
[activityIndicator startAnimating];
}
}];
工作正常。
我发现的唯一问题是,当我释放持有此activityIndicator和greyscaleImage的视图时,我有0.3秒的更改来崩溃应用程序。
为了更清楚,请想象一下ViewController,它的视图通过默认的iOS模式-View方式呈现。现在触发该动画,需要2分钟。在达到2分钟之前,你会发现动画很无聊,你想要忽略那个视图。现在,发布了view,activityIndicator和greyscaleImage,动画o / c无法知道该怎么做。
所以我想知道,在这里做什么+为什么调试器指向
} completion:^(BOOL f){
代替例如[activityIndicator ...
有没有办法,允许用户在2分钟结束前解除视图?
最好的问候
答案 0 :(得分:32)
如果您开始一个需要0.0秒并进入您想要进入的状态的新动画,它将取消旧动画并启动新的(即时)'动画'。
当你想通过前往它所在的地方来停止移动视图时的示例:
[UIView animateWithDuration:0.0
delay:0.0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{movingView.frame = ((CALayer *)movingView.layer.presentationLayer).frame;}
completion:^(BOOL finished){}
];
选项:UIViewAnimationOptionBeginFromCurrentState很重要。不调用它会让动画从上一个动画的结束状态开始。在运动中,它会在翘曲到你希望它停在的地方之前变形到最终位置。即使你的取消 - '动画'是即时的,也可以看到来回跳跃。
注意:动画时间不一定是0.0秒,任何动画都会取消旧动画。但不完全确定不同类型的动画。例如,我不知道更换框架是否会阻止淡入淡出。
答案 1 :(得分:7)
您可以从视图图层中删除所有动画
[movingView.layer removeAllAnimations];
答案 2 :(得分:1)
阻止将在它们启动后始终完成,并且无法停止(除非您使应用程序崩溃)。您可能希望使用通知中心或NSTimer来手动更改帧。
答案 3 :(得分:1)
设置动画选项UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
对我有用。
像这样使用:
[UIView animateWithDuration:0.5
delay:0.0
usingSpringWithDamping:0.7
initialSpringVelocity:0
options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
animations:^{
// Do your stuff here, like changing the frame etc.
self.containerView.frame = CGRectMake(0, 100, 300, 300);
} completion:nil];