質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

941閲覧

UILabelの文字にグラデーションのアニメーションをかけたい

hodoru3sei

総合スコア284

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/12/30 08:32

古いiPhoneのロック画面のようにUILabelの文字にグラデーションをかけてアニメーションさせたいと考えています。
Objective-cの記事ではこちらの記事を見つけたのですが、Objective-cがわからないのでSwiftで実装できません
Swiftではどのように実装するのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

丸投げ案件ではありますが、面白そうなので Swift にしてみました。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 setupGradientView() 9 } 10 11 func setupGradientView() { 12 let gradientView = UIView(frame: CGRect(x: 0, y: 200, width: 320, height: 300)) 13 insertGradientLayer(view: gradientView) 14 15 let label = UILabel(frame: CGRect(x: 0, y: 0, width: 320, height: 160)) 16 label.font = UIFont(name: "DBLCDTempBlack", size: 144) 17 label.textColor = UIColor.black 18 label.text = "24" 19 label.textAlignment = .center 20 label.backgroundColor = .clear 21 self.view.addSubview(label) // この行を消しても動く (a) 22 23 let maskImage = imageFromView(view: label) // これら 4 行を消しても動く (b) 24 let mask = CALayer() // が、a と b 両方消すと動かない 25 mask.contents = maskImage.cgImage 26 mask.frame = CGRect(origin: .zero, size: maskImage.size) 27 28 gradientView.layer.mask = label.layer 29 30 self.view.addSubview(gradientView) 31 } 32 33 func insertGradientLayer(view: UIView) { 34 let beginColor = UIColor.red 35 let endColor = UIColor.blue 36 37 let animation = CABasicAnimation(keyPath: "colors") 38 animation.duration = 2.0 39 animation.repeatCount = HUGE 40 animation.autoreverses = true 41 animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut) 42 animation.fromValue = [beginColor.cgColor, endColor.cgColor] 43 animation.toValue = [endColor.cgColor, beginColor.cgColor] 44 45 let gradient = CAGradientLayer() 46 gradient.frame = view.bounds 47 gradient.colors = [beginColor.cgColor, endColor.cgColor] 48 gradient.add(animation, forKey: "colors") 49 50 view.layer.insertSublayer(gradient, at: 0) 51 } 52 53 func imageFromView(view: UIView) -> UIImage { 54 let renderer = UIGraphicsImageRenderer(bounds: view.bounds) 55 return renderer.image { rendererContext in 56 view.layer.render(in: rendererContext.cgContext) 57 } 58 } 59}

よく考えたら、a と b 両方消して、label を ViewController のプロパティにしても動きますね。
そうすれば label.text を変更するだけで表示も変更できるし。

投稿2021/12/31 19:56

編集2021/12/31 20:10
hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問