Files
App/ios/PhoneScene.swift
Violet Caulfield 5754a3d236 Upgrade to React Native's New Architecture (#302)
Makes the UI operate more synchronously (read: fast 🔥🔥🔥)

Upgrades several dependencies
2025-04-30 03:30:24 -05:00

101 lines
4.2 KiB
Swift

import Foundation
import UIKit
import SwiftUI
extension UIColor {
convenience init(hex: String) {
var hexSanitized = hex.trimmingCharacters(in: .whitespacesAndNewlines)
hexSanitized = hexSanitized.replacingOccurrences(of: "#", with: "")
var rgb: UInt64 = 0
Scanner(string: hexSanitized).scanHexInt64(&rgb)
let r = (rgb & 0xFF0000) >> 16
let g = (rgb & 0x00FF00) >> 8
let b = rgb & 0x0000FF
self.init(
red: CGFloat(r) / 255,
green: CGFloat(g) / 255,
blue: CGFloat(b) / 255,
alpha: 1.0
)
}
}
class PhoneSceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
guard let windowScene = scene as? UIWindowScene else { return }
guard let appRootView = appDelegate.window?.rootViewController?.view else { return }
let containerViewController = UIViewController()
containerViewController.view.backgroundColor = .systemBackground // dynamic light/dark
// Create safe area container
let safeAreaContainer = UIView()
safeAreaContainer.translatesAutoresizingMaskIntoConstraints = false
containerViewController.view.addSubview(safeAreaContainer)
NSLayoutConstraint.activate([
safeAreaContainer.topAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.topAnchor),
safeAreaContainer.bottomAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.bottomAnchor),
safeAreaContainer.leadingAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.leadingAnchor),
safeAreaContainer.trailingAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.trailingAnchor),
])
// Create colored views for top and bottom safe area
let topBar = UIView()
let bottomBar = UIView()
topBar.translatesAutoresizingMaskIntoConstraints = false
bottomBar.translatesAutoresizingMaskIntoConstraints = false
// Color that automatically adapts to dark/light mode
topBar.backgroundColor = UIColor { trait in
return trait.userInterfaceStyle == .dark ? UIColor(hex: "#0C0622") : UIColor(hex:"#FFFFFF")
}
bottomBar.backgroundColor = UIColor { trait in
return trait.userInterfaceStyle == .dark ? UIColor(hex:"#0C0622") : UIColor(hex:"#FFFFFF")
}
containerViewController.view.addSubview(topBar)
containerViewController.view.addSubview(bottomBar)
NSLayoutConstraint.activate([
// Top bar
topBar.topAnchor.constraint(equalTo: containerViewController.view.topAnchor),
topBar.leadingAnchor.constraint(equalTo: containerViewController.view.leadingAnchor),
topBar.trailingAnchor.constraint(equalTo: containerViewController.view.trailingAnchor),
topBar.bottomAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.topAnchor),
// Bottom bar
bottomBar.topAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.bottomAnchor),
bottomBar.leadingAnchor.constraint(equalTo: containerViewController.view.leadingAnchor),
bottomBar.trailingAnchor.constraint(equalTo: containerViewController.view.trailingAnchor),
bottomBar.bottomAnchor.constraint(equalTo: containerViewController.view.bottomAnchor),
])
// Add appRootView inside safeAreaContainer
appRootView.translatesAutoresizingMaskIntoConstraints = false
safeAreaContainer.addSubview(appRootView)
NSLayoutConstraint.activate([
appRootView.topAnchor.constraint(equalTo: safeAreaContainer.topAnchor),
appRootView.bottomAnchor.constraint(equalTo: safeAreaContainer.bottomAnchor),
appRootView.leadingAnchor.constraint(equalTo: safeAreaContainer.leadingAnchor),
appRootView.trailingAnchor.constraint(equalTo: safeAreaContainer.trailingAnchor),
])
// Set up the window
let window = UIWindow(windowScene: windowScene)
window.rootViewController = containerViewController
self.window = window
window.makeKeyAndVisible()
}
}