Skip to content

Instantly share code, notes, and snippets.

View michaelevensen's full-sized avatar

Michael Nino Evensen michaelevensen

View GitHub Profile
@michaelevensen
michaelevensen / EnsureRange.swift
Created December 5, 2019 08:43
Awesome MinMax function.
func ensureRange<T>(value: T, minimum: T, maximum: T) -> T where T : Comparable {
return min(max(value, minimum), maximum)
}
@michaelevensen
michaelevensen / DynamicFireStoreTableView.swift
Created December 4, 2019 14:57
Dynamic updating of UITableView with FireStore changes.
func dataSourceForQuery(_ query: Query) -> CategorySessionsTableViewDataSource {
return CategorySessionsTableViewDataSource(query: query) { (changes, sessions) in
// Success: Perform batch remove / insert of cells
if #available(iOS 11.0, *) {
self.tableView.performBatchUpdates({
self.performUpdates(for: changes)
}, completion: nil)
}
@michaelevensen
michaelevensen / MinMaxExample.swift
Created November 19, 2019 10:12
MinMax Example
// min(max()) example for scrolling
let minValue: CGFloat = 0
let maxValue: CGFloat = 1
let dynamicValue = (trackCell.trackImageView.frame.size.height - locationY) / trackCell.trackImageView.frame.size.height
let delta = min(maxValue, max(minValue, dynamicValue)
@michaelevensen
michaelevensen / FadeTo.swift
Last active November 8, 2019 12:03
A simple fade-to function that employs a Timer for AVPlayer. Allows for specification of fade time rate / interval.
/// Fades current player to specified `volume` with specified `duration`.
public func fadeTo(volume: Float, duration: TimeInterval = 5.0, completionHandler: @escaping () -> Void) {
// Current player
let player = self.currentPlayer
// Calculated increments for volume steps
let volumeIncrementationRate = 0.15 // Volume adjustments pr. seconds
let volumeDistance = player.volume - volume
let volumeSteps = duration / volumeIncrementationRate
@michaelevensen
michaelevensen / DynamicallyUpdatingCollectionViewQuery.swift
Created October 29, 2019 14:42
Dynamically update UICollectionView based on Firestore updatehandler.
func dataSourceForQuery(_ query: Query) -> FeaturedSessionsCollectionViewDataSource {
return FeaturedSessionsCollectionViewDataSource(query: query) { (changes, _) in
// Perform batch remove / insert of cells
self.collectionView?.performBatchUpdates({
for (index, change) in changes.enumerated() {
let indexPath = IndexPath(row: index, section: 0)
switch change.type {
case .added:
self.collectionView?.insertItems(at: [indexPath])
@michaelevensen
michaelevensen / AVPlayerCrossFade.swift
Last active September 24, 2024 07:11
Handles cross-fading between two individual AVPlayers, creates a smooth, undulating loop between two AVPlayerItem's.
import UIKit
import AVFoundation
class ViewController: UIViewController {
// Duplicate players to handle optional cross-fading.
let playerQueue = [AVPlayer(), AVPlayer()]
var timeObserverToken: Any?
@michaelevensen
michaelevensen / ColorScrollView.swift
Created September 25, 2019 10:01
Controlling a UIViewPropertyAnimator based on scrollView delta.
//
// ViewController.swift
// ColorScroll
//
// Created by Michael Nino Evensen on 25/09/2019.
// Copyright © 2019 Michael Nino Evensen. All rights reserved.
//
import UIKit
@michaelevensen
michaelevensen / UIImage+Average.swift
Created September 24, 2019 13:00
Returns average color of UIImage.
extension UIImage {
var averageColor: UIColor? {
guard let inputImage = CIImage(image: self) else { return nil }
let extentVector = CIVector(x: inputImage.extent.origin.x, y: inputImage.extent.origin.y, z: inputImage.extent.size.width, w: inputImage.extent.size.height)
guard let filter = CIFilter(name: "CIAreaAverage", parameters: [kCIInputImageKey: inputImage, kCIInputExtentKey: extentVector]) else { return nil }
guard let outputImage = filter.outputImage else { return nil }
var bitmap = [UInt8](repeating: 0, count: 4)
let context = CIContext(options: [.workingColorSpace: kCFNull])
@michaelevensen
michaelevensen / NewLocalCollection.swift
Created August 21, 2019 11:04
A class for easily unwrapping, storing and mapping FireStore results to models. Inspired by https://gist.github.com/michaelevensen/c74b79292fa8dba437552f7a9f10a5dc.
//
// LocalCollection.swift
// Slow
//
// Created by Michael Nino Evensen on 20/08/2019.
// Copyright © 2019 Michael Nino Evensen. All rights reserved.
//
import FirebaseFirestore
@michaelevensen
michaelevensen / DataSourceLocalCollection.swift
Created August 20, 2019 09:18
Example #3 of custom DataSource implementation using LocalCollection.
//
// Copyright (c) 2018 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software