Skip to content

Instantly share code, notes, and snippets.

@dagronf
dagronf / NSImage+checkerboard.swift
Last active June 3, 2019 20:17
Generate an NSImage containing a checkerboard pattern for a specific size.
private extension NSImage {
static func checkerboardImage(ofSize: CGSize, color1: NSColor, color2: NSColor, checkSize: CGFloat = 8) -> NSImage? {
let width = NSNumber(value: Float(checkSize))
let center = CIVector(cgPoint: CGPoint(x: 0, y: 0))
let darkColor = CIColor(cgColor: color1.cgColor)
let lightColor = CIColor(cgColor: color2.cgColor)
let sharpness = NSNumber(value: 1.0)
guard let filter = CIFilter(name: "CICheckerboardGenerator") else {
return nil
@dagronf
dagronf / ArbitraryAnimationLayer.swift
Last active July 13, 2019 04:42
A layer implementation to connect any item to an animation (swift)
/// A simple layer class to expose an animation progress for a CAAnimation.
public class ArbitraryAnimationLayer: CALayer {
static let KeyPath: String = "progress"
override init() {
super.init()
}
var progressCallback: ((CGFloat) -> Void)?
// FROM: https://www.objc.io/blog/2018/12/18/atomic-variables/
final class Atomic<A> {
private let queue = DispatchQueue(label: "Atomic serial queue")
private var _value: A
init(_ value: A) {
self._value = value
}
var value: A {
@dagronf
dagronf / DSFUnenabledButton.swift
Last active August 9, 2019 08:14
NSButton with interaction disabled
import Cocoa
class DSFUnenabledButton: NSButton {
var isUserInteractionEnabled = false
override func hitTest(_ point: NSPoint) -> NSView? {
return isUserInteractionEnabled ? super.hitTest(point) : nil
}
}
@dagronf
dagronf / DSFRestrictedPanGestureRecognizer.swift
Last active August 9, 2019 08:16
A swift pan gestureRecognizer that can discriminate in a particular direction. Useful for views requiring (for example) horizontal pan support nested inside a uiscrollview (for example)
//
// DSFRestrictedPanGestureRecognizer.swift
// Time Zones
//
// Created by Darren Ford on 30/6/18.
// Copyright © 2018 Darren Ford. All rights reserved.
//
import UIKit
import UIKit.UIGestureRecognizerSubclass
@dagronf
dagronf / String+DSFExtensions.swift
Last active August 9, 2019 08:18
Simple remove/replace characters in a swift string
import Foundation
extension String {
/// Returns a new string by removing any instances of the specified characters
///
/// - Parameter
/// - replacementChars: String containing the characters to replace
/// - Returns: a new string filtering out the specified characters
func removing(charactersIn replacementChars: String) -> String {
return self.filter { replacementChars.contains($0) == false }
@dagronf
dagronf / AutoselectOnFocusTextField.swift
Last active August 16, 2019 07:42
NSTextField overload that automatically selects all text within the field when focussed.
import Cocoa
class AutoselectOnFocusTextField: NSTextField {
override func becomeFirstResponder() -> Bool {
guard super.becomeFirstResponder() else {
return false
}
if let editor = self.currentEditor() {
editor.perform(#selector(selectAll(_:)), with: self, afterDelay: 0)
}
@dagronf
dagronf / UITextView+popover.swift
Created September 6, 2019 23:31
UITextView add other items to selection popover
let menuController = UIMenuController.shared
let item1 = UIMenuItem(title: "Item 1", action: #selector(performItem1))
let item2 = UIMenuItem(title: "Item 2", action: #selector(performItem2))
menuController.menuItems = [item1, item2]
menuController.setMenuVisible(true, animated: true)
@dagronf
dagronf / UIColor+contrasting.swift
Last active September 16, 2019 06:27
Get a contrasting UIColor for a background UIColor that could be used for text (for eg.)
import UIKit
extension UIColor {
private struct ColorComponents {
var r: CGFloat = 0.0
var g: CGFloat = 0.0
var b: CGFloat = 0.0
var a: CGFloat = 0.0
}
@dagronf
dagronf / XCTTest+extensions.swift
Created September 21, 2019 22:28
XCTTest helper function for unwrapping optionals within a test case using try/catch. Makes for a much cleaner test
/// From https://www.rightpoint.com/rplabs/xctassert-optional-unwrapping
// Usage :-
//
// class TestCaseUnwrap: XCTestCase {
// func testUnwrap() throws {
// let string: String? = nil
// let newString = try AssertNotNilAndUnwrap(string)
// XCTAssert(newString.lengthOfBytes(using: .utf8) > 0)
// }