84

何らかの理由で、アニメーション化しようとするtextColorと、うまくいきません。textColorが突然 A から B に変わります。たとえば、赤から黒にアニメーション化することはできますか?

4

11 に答える 11

201

代わりに、次のようにオブジェクト自体にクロスフェード トランジションを使用してみましたか? ある色から別の色へのフェードイン、フェードアウト効果が得られます。

オブジェクティブ C

[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];

スイフト5

UIView.transition(with: creditsLabel, duration: 0.25, options: .transitionCrossDissolve) {
    self.creditsLabel.textColor = .red
}

これは、さまざまな理由から、NSTimers、CATextLayers などを使用するよりも優れています。CATextLayer はテキスト カーニングまたは NSAttributedText を適切にサポートしておらず、NSTimers は遅延しています (コードが多すぎます)。上記のトランジション アニメーションはこのトリックを実行し、チェーン アニメーションでも使用できます。私は同じ問題を抱えていて、すでに上記の解決策を試しましたが、この単純なコードは代わりに驚異的に機能します.

于 2014-01-02T22:13:58.457 に答える
60

Swift 4ソリューション:

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
  self.yourLabel.textColor = .red
}, completion: nil)
于 2016-07-18T12:36:30.503 に答える
13

textColor がアニメーション化できない理由は、UILabel が CATextLayer の代わりに通常の CALayer を使用するためです。

textColor を (テキスト、フォントなどと同様に) アニメート可能にするために、UILabel をサブクラス化して CATextLayer を使用できるようにします。

これはかなりの作業ですが、幸いなことに私はすでにそれを行っています:-)

この記事では、UILabel の完全な説明とドロップイン オープン ソースの代替品を見つけることができます。

于 2011-10-23T13:53:52.527 に答える
9

UILabel の別のインスタンスまたは textColor を持つものを作成してから、それらの 2 つのインスタンス (古い textColor を持つものと新しい textColor を持つもの) の間にアニメーションを適用することができます。

于 2010-03-11T16:54:16.130 に答える
6

ラベルのテキストの色をアニメーション化するコードは次のとおりです。重要な部分は、アニメーションの前にtextColor を clearColor に設定することです

label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
于 2014-06-03T08:56:10.007 に答える
6

この回答は廃止されており、元の質問に対する適切な解決策ではありません。以下の@strangeの回答ははるかに優れており、この回答の代わりに使用する必要があります: https://stackoverflow.com/a/20892927/76559

//以下の古い回答

プロパティはtextColorドキュメントでアニメーション化可能であると指定されていないため、単純な UIView アニメーション ブロックでは実行できないと思います...

NSTimerこれはおそらく、数ミリ秒ごとに発火し、そのたびに徐々に色を設定することで、かなり大雑把に行うことができます。

開始色から終了色までのプリセットカラー値の配列またはその他のコンテナーが必要になるため、これは大雑把だと言います。コアアニメーションなどを使用してこれを行う方法があると確信しています。それが何なのかわからない。

于 2010-03-11T16:22:58.197 に答える
0

@ Strangeの回答に感謝します。Swift 5、Xcode 11 で完全に機能し、構文が少し変更されています。複数のUILabelsのテキストの色をアニメーション化していました。これもあなたの場合は、これを試してください

for label in [label1, label2, ...] as [UILabel] { // loop through a @IBOutlet UILabel array
        UIView.transition(with: label, duration: 0.3, options: .transitionCrossDissolve, animations: {
            label.textColor = .label
        }, completion: nil)
}
于 2020-09-11T15:42:30.393 に答える