gpt4 book ai didi

ios - 在调用 layoutSubviews 之前将在 UIView 上运行的 NSOperation

转载 作者:行者123 更新时间:2023-11-28 22:56:19 25 4
gpt4 key购买 nike

假设我有一个 UIView 的子类我称之为AnimatableView ,我在哪里实现 layoutSubviews列出一些内部内容。

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

- (void) commenceAnimationLoop {

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

AnimationLoopOperationNSOperation 的子类谁的main方法将启动一个无限动画,该动画仅在 isCancelled 时退出。属性变为 YES .

我遇到的问题是在我的 ViewController 中我在其中设置并动画化了 AnimatableView 的实例像这样:

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

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

[animatableView release];
}

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

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

总而言之 - 制作我的 animationLoop 的最佳方法是什么?操作等待 View 布局后再开始?

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

最佳答案

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

因为它只会阻止队列开始新的操作,所以你应该在向队列添加操作之前暂停队列。

在您加载 View 并运行 layoutSubviews 后,您可以使用 [myOperationQueue setSuspended:NO]; 再次恢复操作队列。可以在 viewDidAppear 中执行此操作。

关于ios - 在调用 layoutSubviews 之前将在 UIView 上运行的 NSOperation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10734948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com