0

假设我有一个UIView我将调用的子类AnimatableView,其中我的实现layoutSubviews列出了一些内部内容。

AnimatableView也有commenceAnimationLoop看起来像这样的方法:

- (void) commenceAnimationLoop {

    NSOperation *animationLoop = [[AnimationLoopOperation alloc]init];
    [queue addOperation:animationLoop]; //queue is a NSOperationQueue iVar of AnimatableView
    [animationLoop release];
}

AnimationLoopOperation是一个子类,NSOperationmain方法将启动一个无限动画,该动画只有在属性isCancelled变为 时才会退出YES

我遇到的问题是在ViewController我设置和动画这样的实例的地方AnimatableView

- (void) viewDidLoad {
    AnimatableView *animatableView = [AnimatableView alloc]initWithFrame:someFrame];

    [self.view addSubview: animatableView];
    [animatableView commenceAnimationLoop];

    [animatableView release];
}

问题是在我的实例有机会调用之前NSOperation在执行中创建的(意味着它的内容尚未生成和布局)。commenceAnimationLoopAnimatableViewlayoutSubviews

我有根据地猜测该layoutSubviews方法稍后会调用(当ViewController准备好呈现其视图层次结构时?),但是该commenceAnimationLoop方法会产生一个立即在后台执行的线程。

总而言之-让我的animationLoop操作在开始之前等待视图布局的最佳方法是什么?

为我想要实现的目标提供一些高级上下文 - 我正在使用NSOperation它来启动连续动画。我的想法是我可以提供一种endAnimation可能会调用cancelAllOperations我的队列的方法。所有这些都是希望我可以提供一种方法来启动然后中断无限动画,这两种方法commenceAnimationLoopendAnimation. 也许我在沿着多线程的路线吠叫错误的树?

4

1 回答 1

2

如果您需要layoutSubviews在操作之前运行,那么您不应该在它之前启动操作队列。您可以使用 阻止操作队列启动其他操作[myOperationQueue setSuspended:YES];

由于它只会阻止队列启动新操作,因此您应该在将操作添加到队列之前暂停队列。

查看已加载并layoutSubviews运行后,您可以使用 再次恢复操作队列[myOperationQueue setSuspended:NO];。一个地方可以做到这一点viewDidAppear

于 2012-05-25T07:21:24.910 回答