Skip to content

Instantly share code, notes, and snippets.

@avii-7
Created December 21, 2025 16:37
Show Gist options
  • Select an option

  • Save avii-7/95ba5eccb575a0c3d26f03a0d8146ad9 to your computer and use it in GitHub Desktop.

Select an option

Save avii-7/95ba5eccb575a0c3d26f03a0d8146ad9 to your computer and use it in GitHub Desktop.
Safe Area Edges for SpriteKit
//
// 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