Coordinate Space in SwiftUI

Lakshminaidu C
2 min readNov 12, 2023

--

In SwiftUI, the Coordinate space refers to the system used to specify and manipulate the position and size of views within a user interface. SwiftUI provides various coordinate spaces that help you define the layout and positioning of views relative to each other or to the overall screen.

Here are some key coordinate spaces in SwiftUI:

Local Coordinate Space:

  • The local coordinate space is the default coordinate space for a view.
  • Positions and sizes of child views within a parent view are specified in the local coordinate space.
  • We typically use the GeometryReader to work in the local coordinate space.
GeometryReader { geometry in
// geometry.size.width and geometry.size.height represent the size of the parent view
// Coordinates for child views are specified in the local coordinate space
Text("Hello, World!")
.position(x: geometry.size.width / 2, y: geometry.size.height / 2)
}

Global Coordinate Space:

  • The global coordinate space is the coordinate space of the entire screen.
  • You can convert points and frames between local and global coordinate spaces using the CoordinateSpace and coordinateSpace(name:) methods.
GeometryReader { geometry in
let globalCenter = geometry.frame(in: .global).center
// Use globalCenter for global coordinate space calculations
}

Named Coordinate Spaces:

  • SwiftUI allows you to create named coordinate spaces using the coordinateSpace(name:) method.
  • This can be useful when you want to coordinate the positions of views in a specific way, especially in complex layouts.
struct ContentView: View {
@State private var location = CGPoint.zero


var body: some View {
VStack {
Color.red.frame(width: 100, height: 100)
.overlay(circle)
Text("Location: \(Int(location.x)), \(Int(location.y))")
}
.coordinateSpace(name: "stack")
}


var circle: some View {
Circle()
.frame(width: 25, height: 25)
.gesture(drag)
.padding(5)
}


var drag: some Gesture {
DragGesture(coordinateSpace: .named("stack"))
.onChanged { info in location = info.location }
}
}

Here, the VStack in the ContentView named “stack” is composed of a red frame with a custom Circle view overlay(_:alignment:) at its center.

The circle view has an attached DragGesture that targets the enclosing VStack’s coordinate space. As the gesture recognizer’s closure registers events inside circle it stores them in the shared location state variable and the VStack displays the coordinates in a Text view.

Understanding and using coordinate spaces is essential for creating responsive and dynamic layouts in SwiftUI. It allows you to precisely position and animate views relative to each other or to the overall screen.

Thanks for your time. Please check here for more details Lakshminaidu C

--

--