古いiPhoneのロック画面のようにUILabelの文字にグラデーションをかけてアニメーションさせたいと考えています。
Objective-cの記事ではこちらの記事を見つけたのですが、Objective-cがわからないのでSwiftで実装できません
Swiftではどのように実装するのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア7901
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。