Created
December 21, 2025 16:37
-
-
Save avii-7/95ba5eccb575a0c3d26f03a0d8146ad9 to your computer and use it in GitHub Desktop.
Safe Area Edges for SpriteKit
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // | |
| // SKScene+Edges.swift | |
| // SafeAreaEdges | |
| // | |
| // Created by Arun on 21/12/25. | |
| // | |
| import SpriteKit | |
| // Make sure to access through `viewDidLayoutSubviews` method of ViewController. | |
| // Edges to position nodes in SKScene. | |
| extension SKScene { | |
| struct Edge { | |
| let top, bottom, xCenter, yCenter, left, right: CGFloat | |
| } | |
| private var viewSize: CGSize { view?.bounds.size ?? .zero } | |
| } | |
| // MARK: - Edges | |
| extension SKScene { | |
| var edges: Edge { | |
| Edge( | |
| top: convertPoint(fromView: .zero).y, | |
| bottom: convertPoint(fromView: CGPoint(x: .zero, y: viewSize.height)).y, | |
| xCenter: convertPoint(fromView: CGPoint(x: viewSize.width/2, y: .zero)).x, | |
| yCenter:convertPoint(fromView: CGPoint(x: .zero, y: viewSize.height/2)).y, | |
| left: convertPoint(fromView: .zero).x, | |
| right: convertPoint(fromView: CGPoint(x: viewSize.width, y: .zero)).x | |
| ) | |
| } | |
| var topLeft: CGPoint { CGPoint(x: edges.left, y: edges.top) } | |
| var topCenter: CGPoint { CGPoint(x: edges.xCenter, y: edges.top) } | |
| var topRight: CGPoint { CGPoint(x: edges.right, y: edges.top) } | |
| var centerLeft: CGPoint { CGPoint(x: edges.left, y: edges.yCenter) } | |
| var center: CGPoint { CGPoint(x: edges.xCenter, y: edges.yCenter) } | |
| var centerRight: CGPoint { CGPoint(x: edges.right, y: edges.yCenter) } | |
| var bottomLeft: CGPoint { CGPoint(x: edges.left, y: edges.bottom) } | |
| var bottomCenter: CGPoint { CGPoint(x: edges.xCenter, y: edges.bottom) } | |
| var bottomRight: CGPoint { CGPoint(x: edges.right, y: edges.bottom) } | |
| } | |
| // MARK: - Safe-area respecting edges | |
| extension SKScene { | |
| private var safeAreaInsets: UIEdgeInsets { view?.safeAreaInsets ?? .zero } | |
| var safeAreaEdges: Edge { | |
| Edge( | |
| top: convertPoint(fromView: CGPoint(x: .zero, y: safeAreaInsets.top)).y, | |
| bottom: convertPoint(fromView: CGPoint(x: .zero, y: viewSize.height - safeAreaInsets.bottom)).y, | |
| xCenter: convertPoint(fromView: CGPoint(x: viewSize.width/2, y: .zero)).x, | |
| yCenter:convertPoint(fromView: CGPoint(x: .zero, y: viewSize.height/2)).y, | |
| left: convertPoint(fromView: CGPoint(x: safeAreaInsets.left, y: .zero)).x, | |
| right: convertPoint(fromView: CGPoint(x: viewSize.width - safeAreaInsets.right, y: .zero)).x | |
| ) | |
| } | |
| var safeAreaTopLeft: CGPoint { CGPoint(x: safeAreaEdges.left, y: safeAreaEdges.top) } | |
| var safeAreaTopCenter: CGPoint { CGPoint(x: safeAreaEdges.xCenter, y: safeAreaEdges.top) } | |
| var safeAreaTopRight: CGPoint { CGPoint(x: safeAreaEdges.right, y: safeAreaEdges.top) } | |
| var safeAreaBottomLeft: CGPoint { CGPoint(x: safeAreaEdges.left, y: safeAreaEdges.bottom) } | |
| var safeAreaBottomCenter: CGPoint { CGPoint(x: safeAreaEdges.xCenter, y: safeAreaEdges.bottom) } | |
| var safeAreaBottomRight: CGPoint { CGPoint(x: safeAreaEdges.right, y: safeAreaEdges.bottom) } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment