1

カスタム UIView クラスを取得して背景をフェードさせようとすると問題が発生します。次の StackOverflow の質問を確認しましたが、うまくいかないようです。

UIView で背景色をある色から別の色にフェードする

CALayer の backgroundColor を明示的にアニメーション化するにはどうすればよいですか?

だから私は、ユーザーが物を描くことができるカスタム UIView を持っています。彼らが描いたものが間違っている場合は、背景色を赤にフェードさせてから白に戻したいです。

カスタムUIViewにこのカスタムメソッドが呼び出されました

- (void)indicateMistake;

そのメソッドを呼び出すと、背景色のアニメーションを実行したいので、メソッドにこれがあります:

CABasicAnimation* fade = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
fade.fromValue = (id)[UIColor whiteColor].CGColor;
fade.toValue = (id)[UIColor redColor].CGColor;
[fade setDuration:3];
[self.layer addAnimation:fade forKey:@"fadeAnimation"];

しかし、私がそれをしても何も起こらないようです。

それで、私はばかげた回転アニメーションを試して、それが機能するかどうかを確認しました:

CABasicAnimation* rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rotate.toValue = [NSNumber numberWithInt:M_PI];
[rotate setDuration:1];
[self.layer addAnimation:rotate forKey:@"rotateAnimation"];

何らかの理由で機能し、カスタム UIView が回転します。

次に、StackOverflowの回答をさらに読んで、これを試しました:

[UIView animateWithDuration:3 animations:^{
    [self setBackgroundColor: [UIColor redColor]];
} completion:^(BOOL finished) {
    [self setBackgroundColor: [UIColor whiteColor]];
}];

これにより、色が赤からすぐに白に戻ります。速すぎて見えない時もある。コメントアウトすると、[self setBackgroundColor: [UIColor whiteColor]];赤のままになります。しかし、白から赤への段階的なノードの効果があります。

私はアイデアを使い果たしました..どんな助けもいただければ幸いです!

4

3 に答える 3

9
[UIView animateWithDuration:0.3f animations:^{
   fade.layer.backgroundColor = [UIColor redColor].CGColor;
}

これは、フェード ビューを事前に希望する白色に事前設定していることを前提としています。

アニメーションの最後の試行が白に戻る理由は、animateWithDuration の完了句で、ビューを白に戻すためです。

アニメーションが終了するとその完了節が実行されるため、アニメーション (白 - 赤) が発生し、コンパイラは完了してフェード ビューを白に戻します。

追加のボーナスとして:

どうすれば白に戻せるのか、疑問に思われるかもしれません。

UIButtonさて、a を押すと、この「animateColors」という関数が呼び出されると仮定しましょう。そうは言っても、BOOLを実装するだけです。

- (void)animateColors {        
    if (!isRed) {
        [UIView animateWithDuration:0.3f animations:^{
            fade.layer.backgroundColor = [UIColor redColor].CGColor;
        }];
        isRed = YES;
    } else if (isRed) {
        [UIView animateWithDuration:0.3f animations:^{
            fade.layer.backgroundColor = [UIColor whiteColor].CGColor;
        }];
        isRed = NO;
    }
}

明らかに、インターフェイスまたはヘッダー ファイルでブール値 isRed のプロパティ宣言を作成する必要があります。

于 2013-01-27T00:51:55.270 に答える
5

だから私は、ユーザーが物を描くことができるカスタム UIView を持っています。

それはあなたが実装したことを意味すると思います-drawRect:

IIRC は、デフォルトで (UIView.clearsContextBeforeDrawing設定されている場合)、コンテキストがビューの背景色で塗りつぶされて-drawRect:呼び出され、結果のビットマップが背景色の代わりに画面に描画されます。これをアニメーション化すると、2 つのビットマップ間でアニメーション化することになりますが、これは Core Animation が特に得意とすることではありません。(ここの詳細については間違っている可能性がありますが、動作を説明しています)。

最も簡単な解決策は、背景色を に設定し、描画先のビューの背景[UIColor clearColor]色をアニメーション化することです。これは、ビューを再描画する必要がなく、「背景」に再合成するだけであることを意味します。

于 2013-01-27T01:25:04.137 に答える
2

そのままコードを試してみました。それは完璧に機能しました-それは私のビューの元の白から赤にゆっくりと消えていきました(そしてあなたが期待するものである白に戻った)。したがって、これがうまくいかない場合は、別のことが起こっています。

非常に便利な診断ツールは、面倒なコードを抽出して、他に何も含まれていないプロジェクトを作成することです。私がしたことはあなたがすべきことでした。完全に新しいシングルビューアプリケーションプロジェクトを作成します。これで、ViewControllerとそのビューができました。このメソッドを実装します。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    CABasicAnimation* fade = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
    fade.fromValue = (id)[UIColor whiteColor].CGColor;
    fade.toValue = (id)[UIColor redColor].CGColor;
    [fade setDuration:3];
    [self.view.layer addAnimation:fade forKey:@"fadeAnimation"];
}

プロジェクトを実行します。フェードは完全に機能します。ご覧のとおり、このコードには問題が発生していません。それはどこか別の場所です。おそらく、あなたは色に何かをしている他のコードを持っているでしょう-これを押しつぶしている別のアニメーション。おそらく、いくつかの参照は、あなたがそれが何であると思うかについて言及していません。おそらく何かがレイヤーを覆っているので、それを見ることができません(サブレイヤー)。知るか?プロジェクト全体を表示しませんでした(表示しないでください)。重要なことは、コードが機能することを自分自身に証明して、本当に何が悪いのかを理解できるようにすることです。そして、私はあなたにそれを正確に行う方法を示しました。

于 2013-01-27T01:21:28.760 に答える