0

在 Grand Central Dispatch 我想启动一个微调器 -UIActivityIndicatorView在开始长时间运行的任务之前旋转:

dispatch_async(cloudQueue, ^{

    dispatch_async(dispatch_get_main_queue(),
            ^{
                [self spinnerSpin:YES];
            });

    [self performLongRunningTask];

    dispatch_async(dispatch_get_main_queue(),
            ^{
                [self spinnerSpin:NO];
             });


});

这是spinnerSpin方法:

- (void)spinnerSpin:(BOOL)spin {

    ALog(@"spinner %@", (YES == spin) ? @"spin" : @"stop");

    if (spin == [self.spinner isAnimating]) return;

    if (YES == spin) {

        self.hidden = NO;
        [self.spinner startAnimating];
    } else {

        [self.spinner stopAnimating];
        self.hidden = YES;
    }

}

我从未见过讨论过的一件事是[myView setNeedsDisplay]和之间的区别(如果有的话) [myActivityIndicatorView startAnimating]。他们的行为是否相同?

谢谢,
道格

4

1 回答 1

1

该方法与 a的动画状态[UIView setNeedsDisplay]无关。UIActivityIndicatorView

setNeedsDisplay只是通知系统该视图的状态已经改变,使其当前绘制的表示无效。换句话说,它要求系统drawRect在下一个绘图周期调用该视图的方法。

你很少需要调用setNeedsDisplay从视图外部、从使用视图的代码中调用。每当视图的内部状态发生变化而需要重绘视图时,此方法将由视图的内部逻辑代码调用。

[UIActivityIndicatorView startAnimating]方法是特定于UIActivityIndicatorView类的,只是要求指示器开始动画(例如旋转)。此方法是即时的,无需您调用任何其他方法。

startAnimating附带说明一下,您可以通过简单地调用或stopAnimating不手动显示/隐藏来简化代码。该类UIActivityIndicatorView有一个hidesWhenStopped默认为 的布尔属性YES,这意味着微调器将在开始动画时立即显示,并在停止动画时隐藏自身。

因此,您的spinnerSpin:方法可以像这样重构(只要您没有将hidesWhenStopped属性设置为NO):

- (void)spinnerSpin:(BOOL)spin {
    if (YES == spin) {
        [self.spinner startAnimating];
    } else {
        [self.spinner stopAnimating];
    }
}
于 2012-06-21T20:13:25.913 回答