web-dev-qa-db-ja.com

UILabelのtextColorプロパティをアニメーション化する方法は?

何らかの理由で、textColorをアニメーション化しようとすると、機能しません。 textColorがAからBに突然変化します。赤から黒に、アニメーション化することは可能ですか?

75

この答えは時代遅れであり、元の質問に対する良い解決策ではありません。以下の@strangeの答えははるかに優れているため、この答えの代わりに使用する必要があります: https://stackoverflow.com/a/20892927/76559

//下の古い回答

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

これはおそらく、2 [ミリ秒]ごとにNSTimerを起動することで、かなり粗雑に行うことができ、そのたびに色を徐々に設定します。

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

4
Jasarien

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

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

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

168
strange

Swift 4解決策:

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
  self.yourLabel.textColor = .red
}, completion: nil)
51
budidino

TextColorをアニメートできない理由は、UILabelがCATextLayerではなく通常のCALayerを使用するためです。

TextColor(およびテキスト、フォントなど)をアニメート可能にするには、UILabelをサブクラス化してCATextLayerを使用できるようにします。

これは非常に多くの作業ですが、幸運にも私はすでにそれをしました:-)

完全な説明+ UILabelのドロップインオープンソースの置換は、この 記事 にあります。

12
adamsiton

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

9
benasher44

これは私のために働いた唯一のものでした:

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()
7
shokaveli

ラベルの下にUIViewを配置し、不透明度をアニメーション化するのは非常に簡単です。そのビューにラベルを追加する必要があります。リソース消費の観点からは良い解決策ではないかもしれませんが、かなり簡単です。

0
catchakos