🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

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

Q&A

解決済

1回答

729閲覧

swift UIViewでグラデーション

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2021/02/03 23:41

swift

1import UIKit 2class ViewController: UIViewController { 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 // Do any additional setup after loading the view. 7 8 var colorArr:[UIColor] = [] 9 for i in 1 ..< 33{ 10 let theta = CGFloat(i) * CGFloat.pi / 66 11 colorArr.append(UIColor(red: cos(theta), green: sin(theta), blue: 0, alpha: 1)) 12 } 13 14 for i in 1 ..< 33{ 15 let theta = CGFloat(i) * CGFloat.pi / 66 16 colorArr.append(UIColor(red: 0, green: cos(theta), blue: sin(theta), alpha: 1)) 17 } 18 19 for i in 1 ..< 33{ 20 let theta = CGFloat(i) * CGFloat.pi / 66 21 colorArr.append(UIColor(red: sin(theta), green: 0, blue: cos(theta), alpha: 1)) 22 } 23 24 let radius = self.view.bounds.width / 4 25 let center = self.view.center 26 27 let theta = 2 * CGFloat.pi / CGFloat(colorArr.count) 28 29 for i in 0 ..< colorArr.count{ 30 let colorView = UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30)) 31 colorView.backgroundColor = colorArr[i] 32 colorView.center.x = center.x + radius * cos(CGFloat(i) * theta) 33 colorView.center.y = center.y + radius * sin(CGFloat(i) * theta) 34 view.addSubview(colorView) 35 } 36 37 } 38} 39

UIView99個で円のグラデーションを作るときになぜlet theta = CGFloat(i) * CGFloat.pi / 66
ここは66で割るのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

このコードは、

swift

1 for i in 1 ..< 33{ 2 let theta = CGFloat(i) * CGFloat.pi / 66 3 colorArr.append(UIColor(red: cos(theta), green: sin(theta), blue: 0, alpha: 1)) 4 }

i の範囲は 1 〜 32 ですが、これに円周率 π をかけて 66 で割ることで、0 〜 π / 2 つまり 0 〜 90 度の範囲 (厳密にはちょっと狭い) の角度のラジアン値を計算しています。それを使って、以下の図で丸をつけたところの色を求めてグラデーションしています。

イメージ説明

上の 3 つの正方形は、それぞれ横と縦に赤と緑、緑と青、青と赤のグラデーションになってます。以下の Swift コード (Playground で動きます) で描きました。

swift

1import UIKit 2import PlaygroundSupport 3 4public class MyView : UIView { 5 public var getColor: ((CGFloat, CGFloat) -> CGColor)! 6 public override func draw(_ rect: CGRect) { 7 if getColor == nil { return } 8 let ctx = UIGraphicsGetCurrentContext()! 9 for y in 0..<256 { 10 for x in 0..<256 { 11 ctx.setFillColor(getColor(CGFloat(x) / 255, CGFloat(y) / 256)) 12 ctx.fill(CGRect(x: CGFloat(x), y: CGFloat(y), width: 1, height: 1)) 13 } 14 } 15 for i in 1 ..< 33 { 16 let theta = CGFloat(i) * CGFloat.pi / 66 17 ctx.addEllipse(in: CGRect(x: cos(theta) * 256 - 4, y: sin(theta) * 256 - 4, width: 6, height: 6)) 18 ctx.drawPath(using: .stroke) 19 } 20 } 21} 22 23let view = UIView(frame: CGRect(x: 0, y: 0, width: 768, height: 256)) 24view.backgroundColor = UIColor.white 25let rgView = MyView(frame: CGRect(x: 0, y: 0, width: 256, height: 256)) 26rgView.getColor = { CGColor(red: $0, green: $1, blue: 0, alpha: 1) } 27view.addSubview(rgView) 28let gbView = MyView(frame: CGRect(x: 256, y: 0, width: 256, height: 256)) 29gbView.getColor = { CGColor(red: 0, green: $0, blue: $1, alpha: 1) } 30view.addSubview(gbView) 31let brView = MyView(frame: CGRect(x: 512, y: 0, width: 256, height: 256)) 32brView.getColor = { CGColor(red: $1, green: 0, blue: $0, alpha: 1) } 33view.addSubview(brView) 34PlaygroundPage.current.liveView = view

投稿2021/02/04 05:58

hoshi-takanori

総合スコア7899

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問