1

UIViewController の loadView メソッドで、UIActivityIndi​​cator を開始します。後で loadView で、複雑な UIView を読み込みます。読み込みには約 2 ~ 3 秒かかります。(より具体的には、多くの写真を含む UIScrollView )。私の問題は、UIActivityIndi​​cator スピナーが、他のレイヤーも読み込まれた後にのみ表示されることです。(もちろん、これは私には役に立ちません)。これを処理する正しい方法は何ですか?

- (void)loadView {

    CGRect fullScreenRect=[[UIScreen mainScreen] bounds];

    UIView *contentView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 340, fullScreenRect.size.width)]autorelease];
    self.view = contentView;

    spinner = [[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite] autorelease];
    spinner.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
    spinner.center = self.view.center;
    [self.view addSubview:spinner];
    [spinner startAnimating];


     scrollView=[[[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 340, fullScreenRect.size.width)]autorelease];
     ...setting up scrollView...

     [self.view addSubview:scrollView];
}

- (void)viewDidLoad
{ 
    [super viewDidLoad];
    [spinner removeFromSuperview];
}

やや似たスレッドを見つけました: UIActivityIndi​​catorView は、読み込みが完了するまで表示されません

しかし、バックグラウンド スレッドでロードすることをお勧めしますが、UIView のロードと表示は、私の知る限り、メイン スレッドでのみ可能です。

私は初心者で、私の質問が根本的に間違っていたら申し訳ありません。

4

3 に答える 3

2

Carl Veazey が提案した方法で作成することができました。実際にはかなり簡単でした。新しいバックグラウンド スレッドを生成し、そこに UIScrollView をロードしました。

LoadViewで使用しました:

spinner = [[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite] autorelease];
spinner.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
    spinner.center = self.view.center;
[self.view addSubview:spinner];
[spinner startAnimating];

[self performSelectorInBackground:@selector(populateScrollView) withObject:nil];

と:

-(void) populateScrollView{

    ...creating scrollView...

    [self.view addSubview:scrollView];
    [spinner removeFromSuperview];

}

それは完全に機能します。私にとって本当に奇妙なのは、メイン スレッドではなく、バックグラウンド スレッドでスクロールビューを UI に追加していることです。メインスレッドのUIをいじることしかできないと思っていました。

(GCD でも同じことができます。バックグラウンド スレッドがスクロールビューの読み込みを完了すると、メイン スレッドのキューにスクロールビューを表示できます。しかし、前者のソリューションも何とか機能します...)

于 2012-08-31T10:21:30.870 に答える