是否可以在重写的 touchesEnd 方法中更改 UIView 的 "center" 属性并重绘视图?



我想实现一个基于UIView的center属性的简单动画。我有一个简单的视图,我可以拖动它(uiviewtouchesmoved被覆盖)。动画应该慢慢淡出,就像视图在用户释放它之后的一段时间内在它自己的惯性下移动一样。但现在我只想在触摸结束后移动视图。以下是我在touchesEnded中的代码:

int i;
    for (i=1;i<4;i++)
    {
        self.center = CGPointMake(10*i, 12*i);
        [self setNeedsDisplay];
        usleep(100000);
    }

问题是,当我运行这个,代码执行得很好,但"UIView"更改到晚。我改变了睡眠时间和其他参数,但结果是一样的。看起来视图中所有的"pending changes"只有在覆盖的touchesEnded完成后才会执行。

这是实现这种用户界面功能的正确方法吗?还是我应该寻找其他方法?

如果你知道视图中心的最终位置你可以通过动画来实现:

[UIView animateWithDuration:20
                      delay:0
                    options: UIViewAnimationOptionCurveEaseIn
                 animations:^{
                         youView.center = CGPointMake(newCenterX, newCenterY);
                       }
                       completion:^(BOOL finished){ 
                       }];

如果该代码在touchesEnded中运行,则阻塞了主线程,这就是为什么动画完成时立即发生的原因。您将需要在后台运行此循环以随时间更新视图。当你更新UI时,记得总是回调主线程。

一些线程选项:

performSelectorInBackground: withObject:

performSelectorOnMainThread: withObject: waitUntilDone:

中央调度中心

线程

最新更新