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