0

私は数週間iphoneアプリに取り組んできました。今、私は解決する方法を理解できないアニメーションの問題に遭遇します。多分あなたは助けることができます。詳細は次のとおりです(少し長いですが、我慢してください)。

基本的に、私が達成したい効果は、ユーザーがボタンをクリックすると、読み込みビューがポップアップし、画面全体が非表示になることです。そして、アプリは数秒かかる多くの重い計算を行います。計算が完了すると、soem結果ビュー(チ​​ェッカーボード上のチェッカーのようなもの)がロードビューの下にレンダリングされます。すべての結果ビューがレンダリングされたら、アニメーションアニメーションを使用して、読み込み中のビューを削除し、結果ビューをユーザーに表示しました。これが私がすることです:

  1. ユーザーがボタンをクリックしたら、次のコードを実行します。

    [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1.0]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(loadingViewInserted:finished:context :)]; //非常に高いインデックス番号を使用して、常に一番上になるようにします[self.view insertSubview:loadingViewController.view atIndex:1000];

    [UIView commitAnimations];
    
  2. 「loadingViewInserted」関数では、重い計算作業を行う別の関数を呼び出します。

  3. 計算が完了すると、多くの結果ビュー(チ​​ェッカーボード上のチェッカーなど)がロードビューの下にレンダリングされます。

    for(int colIndex = 1; colIndex <= result.columns; colIndex++) {
        for(int rowIndex = 1; rowIndex <= result.rows; rowIndex++) {
            ResultView *rv = [ResultView resultViewWithData:results[colIndex][rowIndex]];
                [self.view addSubview:rv];
        }
    }
    
  4. すべての結果ビューが追加されると、次のアニメーションが呼び出されて、読み込み中のビューが削除されます。

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
    [loadingViewController.view removeFromSuperview];
    
    [UIView commitAnimations];
    

これを行うことにより、ほとんどの場合(おそらく90%)、私が望むことを正確に実行します。ただし、奇妙な結果が表示されることがあります。ロードビューが最初に期待どおりに表示され、次に表示されなくなる前に、ロードビューの下にあると思われる結果ビューが突然ロードビューの上に表示されます。そしてそれらのいくつかは部分的にレンダリングされます。そして、読み込みビューが丸くなり、すべてが再び正常に見えます。奇妙な状況は1秒未満しか続きませんが、UIを台無しにするほどすでにひどい状況です。

私はこれを修正するためにさまざまな種類のことを試みました(別のスレッドを使用してロードビューを削除し、ロードビューを不透明にします)が、どれも機能しません。少し良くなる唯一のことは、最初にすべての結果ビューを非表示にすることです。最後のアニメーションが終了した後、そのコールバックで、すべての結果ビューを再表示します。ただし、これにより、読み込みビューを丸くしたときに結果がすでに表示されるという優れた効果が失われます。

この時点で、これはiphone(OS 3.0でコンパイル)OSのバグだと思います。または、私が間違ったことを指摘することもできます(または別の方法で行うこともできます)。

(この長い投稿を終えてくれてありがとう、:-))

4

1 に答える 1

1

AddSubview は、ピア ビューの上にサブビューを追加することになっています。おそらく、insertSubview:belowSubview: が必要です。

CPUの競合により、計算がアニメーションを停止しているため、「機能する」ことがあると思います。

于 2010-05-29T16:14:33.437 に答える