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

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

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

Q&A

解決済

1回答

1060閲覧

SwiftUIで6角形を作りたい。

Bakemoon

総合スコア1

0グッド

0クリップ

投稿2021/09/20 03:48

6角形を作る方法を教えてください。

中の色はGradient
外枠はoverlay

説明不足ですが、お力を貸してください。。

完成図がこちらです。
イメージ説明

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/09/24 10:14

回答について全く無反応ですがどうされたのでしょうか
guest

回答1

0

ベストアンサー

画像をみるかぎりは正六角形でいいのでしょうか?

正六角形にかぎりませんが、SwiftUI で図形を描くには Shape プロトコルを採用する構造体をつくります。

path(in:) メソッドを書く必要があり、そこで好きな図形を描画します。

swift

1struct MyShape: Shape { 2 func path(in rect: CGRect) -> Path { 3 Path { path in 4 // rect で描画領域が取得でき、 5 // path で描画する 6 } 7 } 8}

正六角形を描くかんたんな方法は、まん丸の円周を 360 度ぐるりと回るときの、60 度きざみの点を直線で結ぶことです。

円周の上の点の座標は、円の原点、半径、角度の三つがわかれば、三角比のサイン・コサインを使って求められます。

swift

1func pointOnCircle(origin: CGPoint, radius: CGFloat, angle: CGFloat) -> CGPoint { 2 let x = origin.x + radius * cos(angle * CGFloat.pi / 180.0) 3 let y = origin.y + radius * sin(angle * CGFloat.pi / 180.0) 4 return CGPoint(x: x, y: y) 5}

実際に正六角形を表現する Shape は次のようになります。

swift

1struct Hexagon: Shape { 2 func path(in rect: CGRect) -> Path { 3 Path { path in 4 let origin = CGPoint(x: rect.midX, y: rect.midY) 5 let radius = min(rect.size.width / 2.0, rect.size.height / 2.0) 6 let angles: [CGFloat] = [150.0, 210.0, 270.0, 330.0, 30.0, 90.0] 7 let startPoint = self.pointOnCircle(origin: origin, radius: radius, angle: angles.last!) 8 path.move(to: startPoint) 9 for angle in angles { 10 let point = self.pointOnCircle(origin: origin, radius: radius, angle: angle) 11 path.addLine(to: point) 12 } 13 path.closeSubpath() 14 } 15 } 16 17 private func pointOnCircle(origin: CGPoint, radius: CGFloat, angle: CGFloat) -> CGPoint { 18 let x = origin.x + radius * cos(angle * CGFloat.pi / 180.0) 19 let y = origin.y + radius * sin(angle * CGFloat.pi / 180.0) 20 return CGPoint(x: x, y: y) 21 } 22}

Hexagon は他の Shape と同じように使います。正六角形の形状しかあらわしていないので、色を塗ったりしないとみえません。

swift

1import SwiftUI 2 3struct ContentView: View { 4 var body: some View { 5 Hexagon() 6 .foregroundColor(Color.black) 7 } 8}

この六角形に画像のようなグラデーションの六角形をオーバーレイで描くには、.overlay で少し小さく(.padding を追加)した六角形をセットすればよいです。

swift

1import SwiftUI 2 3struct ContentView: View { 4 var body: some View { 5 let lightOrangeColor = Color(red: 0.97, green: 0.3, blue: 0) 6 let orangeColor = Color(red: 0.97, green: 0.76, blue: 0) 7 let linerGradient = LinearGradient( 8 gradient: Gradient(colors: [lightOrangeColor, orangeColor]), 9 startPoint: .top, 10 endPoint: .bottom 11 ) 12 13 Hexagon() 14 .foregroundColor(Color.black) 15 .overlay( 16 Hexagon().fill(linerGradient).padding(12), 17 alignment: .center 18 ) 19 } 20}

はい、できあがり!

イメージ説明

投稿2021/09/21 22:47

編集2021/09/21 23:07
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問