何らかの理由で、textColorをアニメーション化しようとすると、機能しません。textColorが突然AからBに変わります。たとえば赤から黒にアニメーション化することは可能ですか?
何らかの理由で、textColorをアニメーション化しようとすると、機能しません。textColorが突然AからBに変わります。たとえば赤から黒にアニメーション化することは可能ですか?
回答:
この回答は廃止されており、元の質問に対する適切な解決策ではありません。以下の@strangeの回答ははるかに優れており、この回答の代わりに使用する必要があります:https://stackoverflow.com/a/20892927/76559
//以下の古い回答
このtextColor
プロパティはドキュメントでアニメーション化可能として指定されていないため、単純なUIViewアニメーションブロックではアニメーション化できないと思います...
これはおそらくNSTimer
、色を一方から他方に徐々に設定するたびに、数ミリ秒ごとに発射することでかなり大雑把に行うことができます。
開始色から終了色までのプリセットカラー値の配列またはその他のコンテナが必要になるため、これは大雑把だと思います。コアアニメーションなどを使用してこれを行う方法があると確信しています。それが何であるかわからない。
CADisplayLink
ではなく、NSTimer
を使用する必要があります。WWDC 2014セッション236:約13:00に中断可能で応答性の高い相互作用を構築するを参照してください。
代わりに、このようにオブジェクト自体にクロスフェードトランジションを使用してみた場合、ある色から別の色への素晴らしいフェードインフェードアウト効果が得られます。
Objective C
[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];
迅速
UIView.transitionWithView(creditsLabel, duration: 0.25, options: .TransitionCrossDissolve, animations: {
self.creditsLabel.textColor = UIColor.redColor()
},
completion: nil)
これは、さまざまな理由から、NSTimers、CATextLayersなどを使用するよりも優れています。CATextLayerはテキストカーニングまたはNSAttributedTextを適切にサポートしておらず、NSTimersは遅延しています(さらにコードが多すぎます)。上記のトランジションアニメーションはトリックを実行し、チェーンアニメーションでも使用できます。私は同じ問題を抱えており、すでに上記の解決策を試しましたが、この単純なコードは代わりに驚異的に機能します。
UIView.transitionWithView(creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animations: { self.creditsLabel.textColor = UIColor.redColor() }, completion: nil)
Swift 4ソリューション:
UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.yourLabel.textColor = .red
}, completion: nil)
UILabel
は、with
プロパティのインスタンスがある場合にのみ機能することに注意してください。あなたがそのようなことをしてtransition(with: outerView.label…)
それを中に入れようとすると、それは静かに失敗します。
options: .easeInOut
、それは私が持っていたためでしたので、に変更して機能.transitionCrossDissolve
しました。
UILabelの別のインスタンス、またはtextColorを持つインスタンスを作成してから、これら2つのインスタンス(古いtextColorのインスタンスと新しいtextColorのインスタンス)の間にアニメーションを適用してみてください。
これは私のために働いた唯一のものでした:
let changeColor = CATransition()
changeColor.duration = 1
CATransaction.begin()
CATransaction.setCompletionBlock {
selected.label.layer.addAnimation(changeColor, forKey: nil)
selected.label.textColor = .blackColor()
}
selected.nameLabel.textColor = .redColor()
CATransaction.commit()
これが、ラベルのテキストの色をアニメーション化するための私のコードです。重要な部分は、clearColorへの、textColorを設定することで、アニメーションの前に
label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
@ Strangeの回答に感謝します。Swift5、Xcode 11で完全に機能し、構文が少し変更されています。複数のUILabelのテキストの色をアニメーション化していたのですが、これも当てはまる場合は、これを試してください
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)
}