【问题标题】:iPhone iOS what is the correct way to do actions with UIView animateWithDuration block?iPhone iOS 使用 UIView animateWithDuration 块执行操作的正确方法是什么?
【发布时间】:2012-10-18 18:02:16
【问题描述】:

我正在寻找响应用户事件的“长”操作的正确方法。例如,我有这张幻灯片来取消在 0.5 秒内自动离开屏幕的块。 [self coreDataAction] 本身可能需要大约 0.3 秒。

我想确保在用户看到动画结束后操作完成(我不希望用户意外导航到不同的控制器或关闭应用以为操作已完成)。

在这种情况下我应该把[self coreDataAction];放在哪里?块上方、块内还是完成块中?

//should I put it here?

 CGPoint slideToCancelCenter = slideToCancel.view.center;
    [UIView animateWithDuration:0.5 animations:^{
        self.goToSleepButton.center = slideToCancelCenter;
        [UIView setAnimationDuration:0.5];
        CGPoint sliderCenter = slideToCancel.view.center;
        sliderCenter.y += slideToCancel.view.bounds.size.height;
        slideToCancel.view.center = sliderCenter;

//should I put it here?        
// [self coreDataAction];
    } completion:^(BOOL finished) {
//should I put it here?
    } ];

【问题讨论】:

  • 不需要[UIView setAnimationDuration:0.5];,您已经设置了持续时间。如果您不使用基于块的动画,请使用它(请参阅 UIView 类参考了解区别)
  • 我认为你不应该让用户关心这个“动作”是否完成。在后台进行计算,让用户继续做比等待计算机更重要的事情。

标签: iphone objective-c ios animation uiview


【解决方案1】:

处理此问题的更好方法可能是在屏幕上为视图设置动画,然后在完成处理程序中启动coreDataActioncoreDataAction 方法执行完成后,您可以调用一个方法来为幻灯片设置动画以取消离屏视图。

【讨论】:

    【解决方案2】:

    假设 [self coreDataAction] 在主线程上执行,我会说你应该把它放在第一行,以确保在动画完成时方法是完整的。

    【讨论】:

    • 如果coreDataAction 方法中的任何调用是阻塞调用,动画将在coreDataAction 完成其执行后才会发生。如果是这种情况,@AlexStone 可以使用performSelector:withObject:afterDelay: 来异步启动它,但这充其量只会在动画排队后开始coreDataAction 方法的执行。
    • 据我了解,他不希望动画在 coreDataAction 之前完成。如果您以异步方式启动它,则动画可能已完成并且 coreDataAction 仍在工作。由于动画只有半秒,我的想法是他只是在coreDataAction之后才开始。
    • 关于核心数据操作还有其他问题,因为从后台线程执行这些操作可能会导致需要上下文合并(两个线程有​​自己的暂存器和不同的数据)。我还没准备好做这种活动。
    • 我最终将核心数据的调用置于动画之上。有两个动画 - 一个响应用户滑动滑块,这是启动核心数据动作的时候。一旦核心数据操作完成,滑块就会在屏幕外显示动画。
    猜你喜欢
    • 2014-09-26
    • 2021-08-23
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多