はじめに
SwiftUI のコンポーネントまとめです。下記ドキュメントにあるやつをまとめました(ターゲットは iOS14 です)。
Immediate Mode Drawing
Canvas
iOS 15 以上なので割愛。
1 |
struct Canvas<Symbols> where Symbols : View |
GraphicsContext
iOS 15 以上なので割愛。
1 |
@frozen struct GraphicsContext |
Shapes
Rectangle
四角形。
1 |
@frozen struct Rectangle |
簡易実装。
1 2 3 |
Rectangle() .fill(Color.blue) .frame(width: 44, height: 44) |
RoundedRectangle
角丸四角形。
1 |
@frozen struct RoundedRectangle |
簡易実装。
1 2 3 |
RoundedRectangle(cornerRadius: 10) .fill(Color.blue) .frame(width: 44, height: 44) |
Circle
円。
1 |
@frozen struct Circle |
簡易実装。frame
が正方形でなくても円になる。
1 2 3 |
Circle() .fill(Color.blue) .frame(width: 44, height: 44) |
Ellipse
楕円。
1 |
@frozen struct Ellipse |
簡易実装。frame
が正方形なら円になる。
1 2 3 |
Ellipse() .fill(Color.blue) .frame(width: 88, height: 44) |
Capsule
左右が半円のカプセル型四角形?
1 |
@frozen struct Capsule |
簡易実装。frame
が正方形なら円になる。
1 2 3 |
Capsule() .fill(Color.blue) .frame(width: 88, height: 44) |
Path
パス引くやつ?
1 |
@frozen struct Path |
簡易実装。
1 2 3 4 5 6 7 8 |
Path { path in path.move(to: .init(x: 0, y: 44)) path.addLine(to: .init(x: 22, y: 0)) path.addLine(to: .init(x: 44, y: 44)) path.addLine(to: .init(x: 0, y: 44)) } .fill(Color.blue) .frame(width: 44, height: 44) |
Transformed Shapes
1 2 3 4 5 6 7 8 9 10 11 12 |
/// こいつ使ってます struct Triangle: Shape { func path(in rect: CGRect) -> Path { Path { path in path.move(to: .init(x: 0, y: rect.maxY)) path.addLine(to: .init(x: rect.midX, y: 0)) path.addLine(to: .init(x: rect.maxX, y: rect.maxY)) path.addLine(to: .init(x: 0, y: rect.maxY)) } } } |
ScaledShape
指定の Shape
のスケール指定ができるやつ?
1 |
@frozen struct ScaledShape<Content> where Content : Shape |
簡易実装。
1 2 3 |
ScaledShape(shape: Triangle(), scale: .init(width: 0.5, height: 0.5)) .fill(Color.red) .frame(width: 44, height: 44) |
RotatedShape
指定の Shape
を回転できるやつ?
1 |
@frozen struct RotatedShape<Content> where Content : Shape |
簡易実装。
1 2 3 |
RotatedShape(shape: Triangle(), angle: .init(radians: Double.pi)) .fill(Color.red) .frame(width: 44, height: 44) |
OffsetShape
指定の Shape
を平行移動できるやつ?
1 |
@frozen struct OffsetShape<Content> where Content : Shape |
簡易実装。
1 2 3 |
OffsetShape(shape: Triangle(), offset: .init(width: 32, height: 10)) .fill(Color.red) .frame(width: 44, height: 44) |
TransformedShape
指定の Shape
をアフィン変換できるやつ?
1 |
@frozen struct TransformedShape<Content> where Content : Shape |
簡易実装。
1 2 3 |
TransformedShape(shape: Triangle(), transform: .init(rotationAngle: CGFloat.pi/2)) .fill(Color.red) .frame(width: 44, height: 44) |
ContainerRelativeShape
こいつはちょっとわからない。。。
参考になりそうなやつ貼っときます。
1 |
@frozen struct ContainerRelativeShape |
簡易実装。
1 2 3 |
ContainerRelativeShape() .fill(Color.red) .frame(width: 44, height: 44) |
Shape Styles
Color
色。View とかにも設定できる。
1 |
@frozen struct Color |
簡易実装。
1 2 |
Color(.systemRed) .frame(width: 44, height: 44) |
Material
iOS 15 以上のため割愛。
1 |
struct Material |
ImagePaint
画像を繰り返すやつ?
1 |
@frozen struct ImagePaint |
簡易実装。
1 2 3 |
Rectangle() .fill(ImagePaint(image: Image("image"), scale: 0.1)) .frame(width: 44, height: 44) |
AngularGradient
円錐状のグラデーション?
1 |
@frozen struct AngularGradient |
簡易実装。
1 2 3 |
AngularGradient(gradient: Gradient(colors: [.red, .black]), center: .center, angle: .degrees(45)) .frame(width: 44, height: 44) |
EllipticalGradient
iOS 15 以上なので割愛。
1 |
@frozen struct EllipticalGradient |
LinearGradient
線形のグラデーション?
1 |
@frozen struct LinearGradient |
簡易実装。
1 2 3 4 |
LinearGradient(gradient: Gradient(colors: [.green, .black]), startPoint: .leading, endPoint: .trailing) .frame(width: 44, height: 44) |
RadialGradient
放射状のグラデーション?
1 |
@frozen struct RadialGradient |
簡易実装。
1 2 3 4 5 |
RadialGradient(gradient: Gradient(colors: [.blue, .black]), center: .center, startRadius: 0, endRadius: 22) .frame(width: 44, height: 44) |
Gradient
グラデーション情報の構造体。
1 |
@frozen struct Gradient |
簡易実装。
1 |
Gradient(colors: [.blue, .black]) |
Semantic Shape Styles
PrimaryContentStyle
iOS 15 以上なので割愛。
1 |
@frozen struct PrimaryContentStyle |
SecondaryContentStyle
iOS 15 以上なので割愛。
1 |
@frozen struct SecondaryContentStyle |
TertiaryContentStyle
iOS 15 以上なので割愛。
1 |
@frozen struct TertiaryContentStyle |
QuaternaryContentStyle
iOS 15 以上なので割愛。
1 |
@frozen struct QuaternaryContentStyle |
ForegroundStyle
わからん。。。なんなんだこいつ?
1 |
@frozen struct ForegroundStyle |
BackgroundStyle
わからん。。。なんなんだこいつ?
1 |
@frozen struct BackgroundStyle |
TintShapeStyle
iOS 15 以上なので割愛。
1 |
struct TintShapeStyle |
SeparatorShapeStyle
macOS 用なので割愛。
1 |
struct SeparatorShapeStyle |
SelectionShapeStyle
iOS 15 以上なので割愛。
1 |
struct SelectionShapeStyle |
Animation
Animation
easeIn
とかアニメーションのスタイルと時間を設定するやつ?
1 |
@frozen struct Animation |
簡易実装。
1 2 3 4 5 6 7 8 9 10 11 12 |
@State private var isHidden = false VStack { Circle() .fill(Color.purple) .frame(width: 44, height: 44) .opacity(isHidden ? 0.0 : 1.0) .animation(.easeInOut(duration: 1.5)) Button("Animation!") { self.isHidden.toggle() } } |
AnimatablePair
複数プロパティをアニメーションさせるやつ?(ちょっとわからない。。。)
1 |
@frozen struct AnimatablePair<First, Second> where First : VectorArithmetic, Second : VectorArithmetic |
EmptyAnimatableData
空のアニメーション?どういうときに使うかわからん。。。
1 |
@frozen struct EmptyAnimatableData |
簡易実装。
1 |
EmptyAnimatableData() |
AnyTransition
遷移用のアニメーション?
1 |
@frozen struct AnyTransition |
簡易実装。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@State private var isTransition = false Button("Transition!") { withAnimation { isTransition.toggle() } } if isTransition { Rectangle() .fill(Color.red) .frame(width: 44, height: 44) .transition(AnyTransition.slide) } |
下記がなどが用意されている。もうちょっと凝ったやつがやりたい場合は combined
, asymmetric
などを使ってゴニョゴニョする模様。
1 2 3 4 |
static let identity: AnyTransition static let opacity: AnyTransition static var scale: AnyTransition static var slide: AnyTransition |
参考:【SwiftUI】トランジション(transition)の使い方
Geometry
GeometryReader
View の位置とサイズを取得するための View?
1 |
@frozen struct GeometryReader<Content> where Content : View |
簡易実装。
1 2 3 |
GeometryReader { proxy in Text("x: \(proxy.frame(in: .global).origin.x)\ny: \(proxy.frame(in: .global).origin.y)\nwidth: \(proxy.size.width)\nheight: \(proxy.size.height)") } |
GeometryProxy
GeometryReader
でサイズや位置を取得するためのやつ?
1 |
struct GeometryProxy |
Anchor
わからん。。。このへん見たらわかるかも?
SwiftUIのAnchorの使い方を学ぶ
1 |
@frozen struct Anchor<Value> |
UnitPoint
わからん。。。相対位置を指定するやつ?このへん見たらわかるかも?
【SwiftUI】UnitPointの使い方
1 |
@frozen struct UnitPoint |
Angle
これはそのまま角度を表す構造体?
1 |
@frozen struct Angle |
簡易実装。
1 2 |
Text("Hello").rotationEffect(Angle(degrees: 45)) Text("Hello").rotationEffect(Angle(radians: Double.pi/4)) |
ProjectionTransform
わからん!
1 |
@frozen struct ProjectionTransform |
おわりに
使い方わからないやつも多いですがとりあえずこれで一通りは見れた!
iOS 15 でもまだゴリゴリ変わっていってる最中な気がしますがそろそろ SwiftUI 触っていこうと思います。
コメント