Skip to content

Instantly share code, notes, and snippets.

View shaps80's full-sized avatar
🏠
Working from home

Shaps shaps80

🏠
Working from home
View GitHub Profile
import SwiftUI
public extension View {
func pinned(id: Binding<AnyHashable?>) -> some View {
modifier(Pinned(pinnedId: id))
}
}
public extension View {
func pinnedTargetLayout() -> some View {
@shaps80
shaps80 / Sequence+CountWhere.swift
Last active March 27, 2024 12:07
Returns the number of elements matching the closure predicate.
import Swift
extension Sequence {
/// Returns the number of elements matching the closure predicate.
///
/// The `isIncluded` closure is called sequentially comparing each
/// element to determine the number of matches found.
/// This example shows how to find the number of elements matching
/// the given predicate.
///
@shaps80
shaps80 / Print recursively
Created January 25, 2024 09:18
Recursively prints the entire SwiftUI View tree using Mirror
import SwiftUI
extension Mirror {
func printRecusively() {
for child in children {
let label = child.label ?? "<unknown>"
let value = child.value
print(type(of: value), label, value, separator: " | ")
Mirror(reflecting: value)
@shaps80
shaps80 / Interface.swift
Last active January 13, 2024 00:19
SwiftUI Interface (2023)
This file has been truncated, but you can view the full file.
// swift-interface-format-version: 1.0
// swift-compiler-version: Apple Swift version 5.9.2 (swiftlang-5.9.2.2.11 clang-1500.1.0.2.2)
// swift-module-flags: -target arm64e-apple-macos14.2 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Osize -library-level api -library-level api -module-name SwiftUI
// swift-module-flags-ignorable: -enable-bare-slash-regex -user-module-version 5.2.12
import Accessibility
import AppKit
import Combine
import CoreData
import CoreFoundation
@_exported import CoreGraphics
@shaps80
shaps80 / Mirror+Debug.swift
Created January 11, 2024 12:01
Mirror: Print recursively
extension Mirror {
func printRecusively() {
for child in children {
let label = child.label ?? "<unknown>"
let value = child.value
print(type(of: value), label, value, separator: " | ")
Mirror(reflecting: value)
.printRecusively()
}
@shaps80
shaps80 / Variadic Views.swift
Created December 22, 2023 10:02
Enables the creation of custom container views in SwiftUI
import SwiftUI
public extension View {
func variadic<R: View>(@ViewBuilder _ transform: @escaping (_VariadicView.Children) -> R) -> some View {
_VariadicView.Tree(Helper(transform: transform)) { self }
}
}
private struct Helper<R: View>: _VariadicView.MultiViewRoot {
var transform: (_VariadicView.Children) -> R
@shaps80
shaps80 / InlineButtonStyle.swift
Created December 22, 2023 10:01
Provides a button style that can be provided inline, useful during prototyping or for simply 'removing' any styling.
import SwiftUI
public extension View {
func buttonStyle(_ style: @escaping (InlineButtonStyle.Configuration) -> some View) -> some View {
buttonStyle(InlineButtonStyle(style: style))
}
}
public struct InlineButtonStyle: ButtonStyle {
@ViewBuilder let style: (Configuration) -> any View
@shaps80
shaps80 / Divided
Created November 28, 2023 12:17
Automatically adds Divider elements between views in this container.
import SwiftUI
public struct Divided<Content: View, Separator: View>: View {
var content: Content
var separator: Separator
public init(@ViewBuilder content: () -> Content, @ViewBuilder separator: () -> Separator) {
self.content = content()
self.separator = separator()
}
@shaps80
shaps80 / Padding+Scaled.swift
Created October 27, 2023 11:31
Automatically scales the padding value in respect to dynamic type size changes.
import SwiftUI
public extension View {
func padding(_ edges: Edge.Set = .all, scaled length: Length) -> some View {
modifier(PaddingModifier(edges: edges, padding: length.rawValue))
}
func padding(scaled length: Length) -> some View {
modifier(PaddingModifier(edges: .all, padding: length.rawValue))
}
@shaps80
shaps80 / SwiftUI+ScaledFont.swift
Created October 27, 2023 11:27
Automatically scales the font size in respect to dynamic type size changes.
public extension View {
func font<T: BinaryFloatingPoint>(_ scaled: Scaled<T>) -> some View {
modifier(ScaledFontModifier(metric: scaled.value))
}
}
public struct Scaled<T: BinaryFloatingPoint> {
fileprivate let value: T
public static func scaled(size: T) -> Self {
.init(value: size)