动画循环的NSOperation会导致奇怪的滚动行为

时间:2010-03-27 16:09:20

标签: iphone objective-c cocoa-touch

我创建了一个动画循环,我将其作为一个操作运行,以保持我的界面的其余部分响应。几乎在那里,仍有一个问题。当用户触摸结束时,我的UIScrollViews似乎无法可靠地拾取。这意味着,例如,如果用户向下拖动滚动视图,当他们抬起手指时,滚动视图不会弹回原位并且滚动条保持可见。好像手指没有离开屏幕。它需要再次点击滚动视图才能捕捉到正确的位置,滚动条会逐渐消失......

这是我在子类NSOperation中创建的循环:

- (void)main
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

    _displayLink = [[CADisplayLink displayLinkWithTarget: self selector: @selector(animationLoop:)] retain];
    [_displayLink setFrameInterval: 1.0f];
    [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode: NSRunLoopCommonModes];

    while (![self isCancelled])
    {
        NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
        [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        [loopPool drain];
    }

    [_displayLink invalidate];

    [pool release];
}

看来,虽然这项操作正在进行,但事情有点奇怪......

是否有人知道这里会发生什么,甚至更好的解决方法......

谢谢!

1 个答案:

答案 0 :(得分:0)

我不明白为什么你使用这么复杂的解决方案来满足你的需求,这似乎非常经典。

在我看来,你最好使用Quartz基本功能来创建动画,让操作系统选择何时构图渲染。您还可以使用setNeedsLayout和setNeedDisplay方法通知渲染循环,您已修改了某些内容,而不是实现自己的循环。

或许你有一个我不明白的具体需求。