何らかの理由で、アニメーション化しようとするtextColor
と、うまくいきません。textColor
が突然 A から B に変わります。たとえば、赤から黒にアニメーション化することはできますか?
11 に答える
代わりに、次のようにオブジェクト自体にクロスフェード トランジションを使用してみましたか? ある色から別の色へのフェードイン、フェードアウト効果が得られます。
オブジェクティブ 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 は遅延しています (コードが多すぎます)。上記のトランジション アニメーションはこのトリックを実行し、チェーン アニメーションでも使用できます。私は同じ問題を抱えていて、すでに上記の解決策を試しましたが、この単純なコードは代わりに驚異的に機能します.
Swift 4ソリューション:
UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.yourLabel.textColor = .red
}, completion: nil)
textColor がアニメーション化できない理由は、UILabel が CATextLayer の代わりに通常の CALayer を使用するためです。
textColor を (テキスト、フォントなどと同様に) アニメート可能にするために、UILabel をサブクラス化して CATextLayer を使用できるようにします。
これはかなりの作業ですが、幸いなことに私はすでにそれを行っています:-)
この記事では、UILabel の完全な説明とドロップイン オープン ソースの代替品を見つけることができます。
UILabel の別のインスタンスまたは textColor を持つものを作成してから、それらの 2 つのインスタンス (古い textColor を持つものと新しい textColor を持つもの) の間にアニメーションを適用することができます。
ラベルのテキストの色をアニメーション化するコードは次のとおりです。重要な部分は、アニメーションの前にtextColor を clearColor に設定することです
label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
この回答は廃止されており、元の質問に対する適切な解決策ではありません。以下の@strangeの回答ははるかに優れており、この回答の代わりに使用する必要があります: https://stackoverflow.com/a/20892927/76559
//以下の古い回答
プロパティはtextColor
ドキュメントでアニメーション化可能であると指定されていないため、単純な UIView アニメーション ブロックでは実行できないと思います...
NSTimer
これはおそらく、数ミリ秒ごとに発火し、そのたびに徐々に色を設定することで、かなり大雑把に行うことができます。
開始色から終了色までのプリセットカラー値の配列またはその他のコンテナーが必要になるため、これは大雑把だと言います。コアアニメーションなどを使用してこれを行う方法があると確信しています。それが何なのかわからない。
@ 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)
}