Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
// CoordinateSpace.swift
// OpenSwiftUICore
//
// Audited for 6.0.87
// Audited for 6.5.4
// Status: Complete

/// A resolved coordinate space created by the coordinate space protocol.
///
/// You don't typically use `CoordinateSpace` directly. Instead, use the static
/// properties and functions of `CoordinateSpaceProtocol` such as `.global`,
/// `.local`, and `.named(_:)`.
@available(OpenSwiftUI_v1_0, *)
public enum CoordinateSpace {
/// The global coordinate space at the root of the view hierarchy.
case global
Expand All @@ -21,6 +22,7 @@ public enum CoordinateSpace {
case named(AnyHashable)

@_spi(ForOpenSwiftUIOnly)
@available(OpenSwiftUI_v6_0, *)
public struct ID: Equatable, Sendable {
let value: UniqueID

Expand All @@ -30,6 +32,7 @@ public enum CoordinateSpace {
}

@_spi(ForOpenSwiftUIOnly)
@available(OpenSwiftUI_v6_0, *)
case id(CoordinateSpace.ID)

package static let root: CoordinateSpace = .global
Expand All @@ -51,12 +54,14 @@ public enum CoordinateSpace {
@available(*, unavailable)
extension CoordinateSpace: Sendable {}

@available(OpenSwiftUI_v1_0, *)
extension CoordinateSpace {
public var isGlobal: Bool { self == .global }

public var isLocal: Bool { self == .local }
}

@available(OpenSwiftUI_v1_0, *)
extension CoordinateSpace: Equatable, Hashable {
public func hash(into hasher: inout Hasher) {
switch self {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// CoordinateSpaceProtocol.swift
// OpenSwiftUICore
//
// Audited for 6.0.87
// Audited for 6.5.4
// Status: Complete

/// A frame of reference within the layout system.
Expand Down Expand Up @@ -30,6 +30,7 @@
/// You don't typically create types conforming to this protocol yourself.
/// Instead, use the system-provided `.global`, `.local`, and `.named(_:)`
/// implementations.
@available(OpenSwiftUI_v5_0, *)
public protocol CoordinateSpaceProtocol {
/// The resolved coordinate space.
var coordinateSpace: CoordinateSpace { get }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
// GlobalCoordinateSpace.swift
// OpenSwiftUICore
//
// Audited for 6.0.87
// Audited for 6.5.4
// Status: Complete

/// The global coordinate space at the root of the view hierarchy.
@available(OpenSwiftUI_v5_0, *)
public struct GlobalCoordinateSpace: CoordinateSpaceProtocol {
public init() {}

Expand All @@ -15,6 +16,7 @@ public struct GlobalCoordinateSpace: CoordinateSpaceProtocol {
@available(*, unavailable)
extension GlobalCoordinateSpace: Sendable {}

@available(OpenSwiftUI_v5_0, *)
extension CoordinateSpaceProtocol where Self == GlobalCoordinateSpace {
/// The global coordinate space at the root of the view hierarchy.
public static var global: GlobalCoordinateSpace { .init() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
// LocalCoordinateSpace.swift
// OpenSwiftUICore
//
// Audited for 6.0.87
// Audited for 6.5.4
// Status: Complete

/// The local coordinate space of the current view.
@available(OpenSwiftUI_v5_0, *)
public struct LocalCoordinateSpace: CoordinateSpaceProtocol {
public init() {}

Expand All @@ -15,6 +16,7 @@ public struct LocalCoordinateSpace: CoordinateSpaceProtocol {
@available(*, unavailable)
extension LocalCoordinateSpace: Sendable {}

@available(OpenSwiftUI_v5_0, *)
extension CoordinateSpaceProtocol where Self == LocalCoordinateSpace {
/// The local coordinate space of the current view.
public static var local: LocalCoordinateSpace { .init() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
// NamedCoordinateSpace.swift
// OpenSwiftUICore
//
// Audited for 6.0.87
// Audited for 6.5.4
// Status: Complete

/// A named coordinate space.
///
/// Use the `coordinateSpace(_:)` modifier to assign a name to the local
/// coordinate space of a parent view. Child views can then refer to that
/// coordinate space using `.named(_:)`.
@available(OpenSwiftUI_v5_0, *)
public struct NamedCoordinateSpace: CoordinateSpaceProtocol, Equatable {
package var name: CoordinateSpace.Name

Expand All @@ -20,9 +21,7 @@ public struct NamedCoordinateSpace: CoordinateSpaceProtocol, Equatable {
public var coordinateSpace: CoordinateSpace { name.space }
}

@available(*, unavailable)
extension NamedCoordinateSpace: Sendable {}

@available(OpenSwiftUI_v5_0, *)
extension CoordinateSpaceProtocol where Self == NamedCoordinateSpace {
/// Creates a named coordinate space using the given value.
///
Expand All @@ -41,3 +40,6 @@ extension CoordinateSpaceProtocol where Self == NamedCoordinateSpace {
NamedCoordinateSpace(name: .id(id))
}
}

@available(*, unavailable)
extension NamedCoordinateSpace: Sendable {}
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,75 @@
// ScrollCoordinateSpace.swift
// OpenSwiftUICore
//
// Audited for 6.0.87
// Audited for 6.5.4
// Status: Complete

package enum ScrollCoordinateSpace {
package static let vertical: CoordinateSpace.ID = .init()
package static let horizontal: CoordinateSpace.ID = .init()
package static let all: CoordinateSpace.ID = .init()
package static let content: CoordinateSpace.ID = .init()
package static let safeArea: CoordinateSpace.ID = .init()
}

extension CoordinateSpace {
package static var verticalScrollView: CoordinateSpace { .id(ScrollCoordinateSpace.vertical) }
package static var horizontalScrollView: CoordinateSpace { .id(ScrollCoordinateSpace.horizontal) }
package static var scrollView: CoordinateSpace { .id(ScrollCoordinateSpace.all) }
package static var scrollViewContent: CoordinateSpace { .id(ScrollCoordinateSpace.content) }
package static var verticalScrollView: CoordinateSpace {
.id(ScrollCoordinateSpace.vertical)
}

package static var horizontalScrollView: CoordinateSpace {
.id(ScrollCoordinateSpace.horizontal)
}

package static var scrollView: CoordinateSpace {
.id(ScrollCoordinateSpace.all)
}

package static var scrollViewContent: CoordinateSpace {
.id(ScrollCoordinateSpace.content)
}

package static var scrollViewSafeArea: CoordinateSpace {
let id = Semantics.NonScrollableSafeAreaEdges.isEnabled
? ScrollCoordinateSpace.safeArea
: ScrollCoordinateSpace.content
return .id(id)
}
}

extension CoordinateSpace.Name {
package static var verticalScrollView: CoordinateSpace.Name { .id(ScrollCoordinateSpace.vertical) }
package static var horizontalScrollView: CoordinateSpace.Name { .id(ScrollCoordinateSpace.horizontal) }
package static var scrollView: CoordinateSpace.Name { .id(ScrollCoordinateSpace.all) }
package static var scrollViewContent: CoordinateSpace.Name { .id(ScrollCoordinateSpace.content) }
package static var verticalScrollView: CoordinateSpace.Name {
.id(ScrollCoordinateSpace.vertical)
}

package static var horizontalScrollView: CoordinateSpace.Name {
.id(ScrollCoordinateSpace.horizontal)
}

package static var scrollView: CoordinateSpace.Name {
.id(ScrollCoordinateSpace.all)
}

package static var scrollViewContent: CoordinateSpace.Name {
.id(ScrollCoordinateSpace.content)
}
}

@available(OpenSwiftUI_v5_0, *)
extension CoordinateSpaceProtocol where Self == NamedCoordinateSpace {
/// The named coordinate space that is added by the system for the innermost
/// containing scroll view that allows scrolling along the provided axis.
public static func scrollView(axis: Axis) -> Self {
NamedCoordinateSpace(name: axis == .horizontal ? .horizontalScrollView : .verticalScrollView)
}

/// The named coordinate space that is added by the system for the innermost
/// containing scroll view.
public static var scrollView: NamedCoordinateSpace { NamedCoordinateSpace(name: .scrollView) }

package static var scrollViewContent: NamedCoordinateSpace { NamedCoordinateSpace(name: .scrollViewContent) }
public static var scrollView: NamedCoordinateSpace {
NamedCoordinateSpace(name: .scrollView)
}

package static var scrollViewContent: NamedCoordinateSpace {
NamedCoordinateSpace(name: .scrollViewContent)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ public struct GeometryProxy {
guard let placementContext else {
return (rect, true)
}
let exact = rect.whileClippingToScrollViewsConvert(
let exact = rect.convertAndClipToScrollView(
to: space,
transform: placementContext.transform
)
Expand Down
Loading
Loading