Skip to content

Instantly share code, notes, and snippets.

View myell0w's full-sized avatar
🙌

Matthias Tretter myell0w

🙌
View GitHub Profile
@myell0w
myell0w / PlatformDependentValue.swift
Created May 4, 2020 14:00
Cross-Platform Helpers for iOS/macOS
/// Used to identify traits of the current UI Environment - especially useful for cross-platform code
public struct MNCUITraits: Withable {
/// Does *not* identify the device type, but the idiom of the layout to apply
/// This means that e.g. on iPad the layoutIdiom can be `.phone`, if run in Split Screen or SlideOver
public enum LayoutIdiom {
case phone(hasRoundCorners: Bool)
case pad(hasRoundCorners: Bool)
case mac
}
@myell0w
myell0w / CGPath Utilities.swift
Last active July 18, 2023 13:14
Some helpers to make working with CGPaths in Swift easier
/*
Copyright 2021 Matthias Tretter
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
@myell0w
myell0w / UIView+Hierarchy.swift
Created June 13, 2018 12:05
Traverse View Hierarchy Upwards
extension UIView {
func findFirstSuperview<T>(ofClass viewClass: T.Type, where predicate: (T) -> Bool) -> T? where T: UIView {
var view: UIView? = self
while view != nil {
if let typedView = view as? T, predicate(typedView) {
break
}
view = view?.superview
}
@myell0w
myell0w / KeyboardLayoutGuide.swift
Created July 19, 2017 14:53
A UILayoutGuide that follows the Keyboard on iOS
import Foundation
import UIKit
/// Used to create a layout guide that pins to the top of the keyboard
final class KeyboardLayoutGuide {
private let notificationCenter: NotificationCenter
private let bottomConstraint: NSLayoutConstraint
@myell0w
myell0w / LongPressGestureRecognizer.swift
Created July 19, 2017 14:49
A UIGestureRecognizer that fires either on long-press or on a force-touch (3D Touch ™️)
import Foundation
import UIKit
import UIKit.UIGestureRecognizerSubclass
/// A Gesture Recognizer that fires either on long press, or on "3D Touch"
final class MNTLongPressGestureRecognizer: UILongPressGestureRecognizer {
// MARK: - Properties
@myell0w
myell0w / ArrayCast.swift
Created September 1, 2016 13:16
NSMutableArray -> [TypedArray]
func allNodesWithoutSorting() -> [MNCNode] {
let allNodes = NSMutableArray(object: self.mainNode)
self.addAll(subnodesOfNode: self.mainNode, toArray: allNodes)
// trick the compiler…
return (allNodes as AnyObject as? [MNCNode]) ?? []
}
@myell0w
myell0w / externalKeyboard.m
Last active October 31, 2023 11:21
Detect if there's an external keyboard attached (iOS)
// direct check for external keyboard
+ (BOOL)_isExternalKeyboardAttached
{
BOOL externalKeyboardAttached = NO;
@try {
NSString *keyboardClassName = [@[@"UI", @"Key", @"boa", @"rd", @"Im", @"pl"] componentsJoinedByString:@""];
Class c = NSClassFromString(keyboardClassName);
SEL sharedInstanceSEL = NSSelectorFromString(@"sharedInstance");
if (c == Nil || ![c respondsToSelector:sharedInstanceSEL]) {

Keybase proof

I hereby claim:

  • I am myell0w on github.
  • I am myell0w (https://keybase.io/myell0w) on keybase.
  • I have a public key whose fingerprint is 61A1 EE8B 9D4D EE36 96CC 60D7 25EC 905A 888F 5AD8

To claim this, I am signing this object:

@myell0w
myell0w / UIView+QueuedAnimations.m
Created April 14, 2014 10:09
UIView queued animations
@implementation UIView (AnimationQueue)
+ (void)mtd_animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion semaphore:(dispatch_semaphore_t)semaphore {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self animateWithDuration:duration animations:animations completion:^(BOOL finished) {
dispatch_semaphore_signal(semaphore);
if (completion) {
completion(finished);
}
@myell0w
myell0w / BoldDynamicText
Last active January 2, 2016 14:09
Respect the accessibility setting "Bold Text" on iOS7, when implementing Dynamic Type with a custom font.
BOOL MTDIsBoldTextEnabled(void) {
static BOOL boldTextEnabled = NO;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// Hack that checks if the "bold text" flag in the accessibility settings is enabled
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
boldTextEnabled = [font.fontName rangeOfString:@"MediumP4"].location != NSNotFound;
});