Skip to content

Instantly share code, notes, and snippets.

View Tricertops's full-sized avatar
:octocat:

Martin Kiss Tricertops

:octocat:
View GitHub Profile
@Tricertops
Tricertops / UIColor+DisplayP3HSB.swift
Last active March 31, 2017 14:40
Construct UIColor using HSB components in Display P3 color space.
extension UIColor {
convenience init(displayP3Hue hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat = 1) {
/// HSB to RGB conversion doesn’t depend on color space, so we can use default UIColor space.
let converter = UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: 1)
var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0
converter.getRed(&red, green: &green, blue: &blue, alpha: nil)
self.init(displayP3Red: red, green: green, blue: blue, alpha: alpha)
@Tricertops
Tricertops / gist:9738484
Created March 24, 2014 11:23
Runtime @protocol introspection
+ (void)enumerateAdoptedProtocolsOfProtocol:(Protocol *)protocol usingBlock:(void(^)(Protocol *adoptedProtocol))block {
unsigned int adoptedCount = 0;
Protocol * __unsafe_unretained *adoptedProtocolList = protocol_copyProtocolList(protocol, &adoptedCount);
if (adoptedProtocolList) {
for (NSUInteger index = 0; index < adoptedCount; index++) {
Protocol *adoptedProtocol = adoptedProtocolList[index];
block(adoptedProtocol);
}
free(adoptedProtocolList);
@Tricertops
Tricertops / gist:630fa96044b71d8083b9e397f0b84a1c
Last active November 3, 2016 13:37
How to load PaintCode Telekinesis.framework from debugger.
# This will load Telekinesis from debugger (don’t forget to use correct path).
# You can use this debugger command as breakpoint handler on UIApplicationMain.
expr (void *)dlopen("/path/to/Telekinesis.framework/Telekinesis", 0x2)
# You can also check for class "TeleHub", to make sure it’s not loaded twice:
expr (Class)NSClassFromString(@"TeleHub") == nil ? (void *)dlopen("/path/to/Telekinesis.framework/Telekinesis", 0x2) : ((void*)0)
@Tricertops
Tricertops / KVObserver.h
Last active December 24, 2015 22:49
Simplest KVO using blocks. You don't have to use ReactiveCocoa to blockify KVO.
#import <Foundation/Foundation.h>
typedef void(^KVObservingBlock)(id value, NSDictionary *change);
@interface KVObserver : NSObject
- (instancetype)initWithBlock:(KVObservingBlock)block;
@end
@Tricertops
Tricertops / UITableViewDataSource.m
Created September 28, 2013 16:57
Animated scrolling for table view section index.
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
NSUInteger section = ...
CGRect rect = [self.tableView rectForSection:section];
// Include content inset
rect.origin.y -= self.tableView.contentInset.top;
// Restore previous offset and animate to destination
CGPoint offset = self.tableView.contentOffset;
@Tricertops
Tricertops / gist:6104989
Created July 29, 2013 15:06
My variant of Assertion macros
#if !defined(NS_BLOCK_ASSERTIONS)
#define MTKAssert(CONDITION, MESSAGE, ...)\
if ( ! (CONDITION) && (( [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] file:[NSString stringWithUTF8String:__FILE__] lineNumber:__LINE__ description:MESSAGE, ##__VA_ARGS__], YES)) )
#else
#define MTKAssert(CONDITION, MESSAGE, ...)\
if ( ! (CONDITION) && (( NSLog(@"*** Assertion failure in %s, %s:%d, Condition not satisfied: %s, reason: '" MESSAGE "'", __PRETTY_FUNCTION__, __FILE__, __LINE__, #CONDITION, ##__VA_ARGS__), YES)) )
@Tricertops
Tricertops / gist:5483361
Created April 29, 2013 17:49
Helper functions to round screen coordinates and dimensions to screen scale.
CGFloat CGFloatAdjustToScreenScale(CGFloat value, NSRoundingMode mode) {
CGFloat (*roundingFunction)(CGFloat);
switch (mode) {
case NSRoundPlain: roundingFunction = &roundf; break;
case NSRoundUp: roundingFunction = &ceilf; break;
case NSRoundDown: roundingFunction = &floorf; break;
case NSRoundBankers:roundingFunction = &roundf; break;
}
CGFloat scale = [[UIScreen mainScreen] scale];
CGFloat result = roundingFunction(value * scale) / scale;
@Tricertops
Tricertops / gist:5356053
Created April 10, 2013 16:12
Convert HTML string to plain text by deleting HTML tags and replacing escaped sequences.
- (NSString *)stringByDeletingHTML {
// Delete HTMl tags.
/// http://stackoverflow.com/questions/277055/remove-html-tags-from-an-nsstring-on-the-iphone
NSRange range;
NSMutableString *string = [self mutableCopy];
while ((range = [string rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
[string deleteCharactersInRange:range];
// Replace escaped sequences.
NSDictionary *escapes = @{
2013-03-22 21:26:36.231 TeeVee[86457:c07] *** -[__NSCFCalendar components:fromDate:]: date cannot be nil
I mean really, what do you think that operation is supposed to mean with a nil date?
An exception has been avoided for now.
A few of these errors are going to be reported with this complaint, then further violations will simply silently do whatever random thing results from the nil.
Here is the backtrace where this occurred this time (some frames may be missing due to compiler optimizations):
(
0 CoreFoundation 0x0283da75 -[__NSCFCalendar components:fromDate:] + 85
1 TeeVee 0x00037e0e -[TVUpcomingEpisodeViewController viewDidLoad] + 3886
...
// How do you implement lazy loading getters?
- (NSString *)title {
if ( ! self->_title) {
NSString *string = @"lazy loaded";
// Do some real stuff here...
self->_title = string;
}
return self->_title;
}