Skip to content

Instantly share code, notes, and snippets.

struct PressedButtonStyle: ButtonStyle {
@Binding var isPressed: Bool
func makeBody(configuration: Configuration) -> some View {
var animation: Animation?
/// only change when it's different
if isPressed != configuration.isPressed {
if configuration.isPressed {
animation = .spring(
struct ScalingButtonStyle: ButtonStyle {
var scale = CGFloat(0.95)
func makeBody(configuration: Configuration) -> some View {
let animation: Animation? = {
if configuration.isPressed {
/// pressing down
return .spring(
response: 0.19,
dampingFraction: 0.45,
@aheze
aheze / Tip.swift
Created October 6, 2022 01:19
Tip using Popovers
//
// PhotosVC+Tips.swift
// Find-3
//
// Created by A. Zheng (github.com/aheze) on 10/4/22.
// Copyright © 2022 A. Zheng. All rights reserved.
//
import Popovers
import SwiftUI
@aheze
aheze / Pulse.swift
Created October 3, 2022 02:03
SwiftUI pulse animation
struct ContentView: View {
static let fadeInDuration = CGFloat(1.1)
static let pulseDuration = CGFloat(1.6)
static let fadeOutDuration = CGFloat(0.3)
static let interval = CGFloat(1.6)
@State var isAnimating = false
@State var timer = Timer.publish(every: interval, on: .main, in: .common).autoconnect()
@State var circlesIDs = [UUID()]
@aheze
aheze / starcounter
Last active May 13, 2023 19:59
Count how many stars you have on GitHub!
# Paste this into your terminal:
curl https://gist.githubusercontent.com/aheze/8e7910c3b48e383bae07d27d4fb9cf57/raw/e5242c41703572936e93fee691e37d23903c9824/starcounter.js -sSL | node - aheze -t 10
var https = require('https'),
user = process.argv[2],
opts = parseOpts(process.argv.slice(3))
request('/users/' + user, function (res) {
if (!res.public_repos) {
console.log(res.message)
return
}
var pages = Math.ceil(res.public_repos / 100),
public extension View {
/**
Read a view's size. The closure is called whenever the size changes.
From https://stackoverflow.com/a/66822461/14351818
*/
func sizeReader(size: @escaping (CGSize) -> Void) -> some View {
return background(
GeometryReader { geometry in
Color.clear
.preference(key: ContentSizeReaderPreferenceKey.self, value: geometry.size)
@aheze
aheze / PassthroughSubject.swift
Last active July 30, 2022 17:24
Combine alternative to NotificationCenter
import Combine
import UIKit
class ViewModel {
var enableSubject = PassthroughSubject<Bool, Never>() /// Similar to NotificationCenter
var cancellables = Set<AnyCancellable>() /// Lets you store combine subscribers
}
class ViewController: UIViewController {
let viewModel = ViewModel()
extension View {
/**
Read a view's size. The closure is called whenever the size itself changes, or the transaction changes (in the event of a screen rotation.)
From https://stackoverflow.com/a/66822461/14351818
*/
func readSize(size: @escaping (CGSize) -> Void) -> some View {
return background(
GeometryReader { geometry in
Color.clear
.preference(key: ContentSizeReaderPreferenceKey.self, value: geometry.size)
@aheze
aheze / LocationSearch.swift
Created June 16, 2022 23:13
Get multiple map locations from a query string
enum Shared {
static func getMatchingLocations(from query: String, region: MKCoordinateRegion) async -> (locations: [MKMapItem], region: MKCoordinateRegion?) {
let request = MKLocalSearch.Request()
request.naturalLanguageQuery = query
request.region = region
let search = MKLocalSearch(request: request)
return await withCheckedContinuation { continuation in
search.start { response, _ in
guard let response = response else {