3

私は無駄に以下のいくつかのバリエーションを試しました。私が欲しいのは、いくつかのことを示すカールダウントランジションと、その逆のカールトランジションバックアップです。透明感があるので、透明なものがビューの上に転がる効果があります。これは、ロールアップとロールダウンで呼び出される関数です。

-(void) setVisibility:(BOOL)isVisible animated:(BOOL)animated{    
    if (isVisible){
        self.topFold.hidden = YES;
    }
    [UIView transitionWithView:self 
                      duration:1.0f 
                       options:isVisible ? UIViewAnimationOptionTransitionCurlDown : UIViewAnimationOptionTransitionCurlUp
                    animations:^{
                        self.imageView.hidden = !isVisible;
                        self.background.hidden = !isVisible;
                        self.bottomCornerFold.hidden = !isVisible;
                    }
                    completion:^(BOOL finished){
                        if (!isVisible){
                            self.topFold.hidden = NO;
                        }
                    }
    ];
}

私は10億の異なるシナリオを試しましたが、これが最も近いものです。ただし、問題は、isVisible=YESで実行するとtopFold、遷移が完了するまで表示されたままになることです。つまり、新しいものが上に表示されるビューのコピーがあるかのように、新しいものがその上にロールダウンします。そして、それが完了すると、すべてが正しいバージョンに置き換えられます。
明確にするために、私はアニメーションが始まる前に隠そうとしていtopFoldますが、何らかの理由で、アニメーションが完了するまでぶらぶらしていると主張しています。ここにポインタが欲しいです。

4

2 に答える 2

1

不器用だが効果的な部門から、2つのアニメーションをネストしました。一方は他方の完了ブロック内にあります。このように見え、機能します:

 [UIView transitionWithView:self 
                          duration:0.0f 
                           options:nil
                        animations:^{
                            if (isVisible){
                                self.topFold.hidden = YES;
                            }
                        }
                        completion:^(BOOL finished){
                            [UIView transitionWithView:self 
                                              duration:1.0f 
                                               options:isVisible ? UIViewAnimationOptionTransitionCurlDown : UIViewAnimationOptionTransitionCurlUp
                                            animations:^{
                                                self.imageView.hidden = !isVisible;
                                                self.background.hidden = !isVisible;
                                                self.bottomCornerFold.hidden = !isVisible;
                                            }
                                            completion:^(BOOL finished){
                                                if (!isVisible){
                                                    self.topFold.hidden = NO;
                                                }
                                            }
                             ];
                        }
         ];
于 2012-08-01T02:56:37.440 に答える
0

もう1つのアプローチは、runloopを短時間開始して、topFoldビューを非表示にする時間を与えることです。

if (isVisible){
    self.topFold.hidden = YES;
    [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.0001]];
}
于 2013-02-06T00:29:32.823 に答える