Skip to content

Instantly share code, notes, and snippets.

View indragiek's full-sized avatar

Indragie Karunaratne indragiek

View GitHub Profile
@jwilling
jwilling / gist:4186817
Last active March 5, 2023 22:01
Lets help improve AppKit.

Is AppKit causing you frustration? Instead of just complaining about it, lets try to make it better by compiling a list of specific problems with AppKit. Leave a comment below, and I'll include it in the list.


##NSView##

  • NSView does not have the ability to set an affine transform (rdar://15608609)
  • Controls that have cells (such as NSTextField) do not respond properly when layer-backed. Take NSButton as an example. When not layer-backed, it will animate properly using the animator proxy. When layer-backed, using the animator proxy breaks focus rings (they jump to destination immediately). Currently, directly manipulating the layer of a cell-based control is not supported (and will lead to a broken interface), but is much needed. (rdar://15608822)

##NSViewController##

  • NSViewController could be more useful. It has -loadView but no other lifecycle methods. (rdar://15608948)
@joshaber
joshaber / gist:4230872
Created December 7, 2012 04:57
ReactiveCocoa stopwatch
self.startButton.rac_command = [RACCommand command];
self.stopButton.rac_command = [RACCommand command];
__unsafe_unretained id weakSelf = self;
id<RACSignal> tick = [[[[self.startButton.rac_command
map:^(id _) {
RTAFirstView *strongSelf = weakSelf;
// Map each start button click to a new signal that fires every second
// and stops when the stop button is clicked.
return [[RACSignal interval:1] takeUntil:strongSelf.stopButton.rac_command];
@joshaber
joshaber / gist:4238342
Created December 8, 2012 02:54
ReactiveCocoa stopwatch with reset
self.startButton.rac_command = [RACCommand command];
self.stopButton.rac_command = [RACCommand command];
self.resetButton.rac_command = [RACCommand command];
static const CGFloat interval = 0.01;
__unsafe_unretained id weakSelf = self;
// Signal id -> Signal Signal Number
// Map each click of the start button to a signal that fires at our interval
// and stops when the stop button's clicked.
id<RACSignal> start = [self.startButton.rac_command map:^(id _) {
@ryannichols
ryannichols / Measuring Height of Text
Created January 20, 2013 06:19
This is an accurate way to get an NSRect representing the size of rendered text.
stringDrawingOptions = (NSStringDrawingUsesLineFragmentOrigin | NSLineBreakByWordWrapping | NSStringDrawingUsesDeviceMetrics);
NSAttributedString *attr = [[NSAttributedString alloc] initWithString:text attributes:yourAttrDictHere];
NSRect frame = [attr boundingRectWithSize:NSMakeSize(widthYouWant, 0.0) options:stringDrawingOptions];
@kvnsmth
kvnsmth / example-subtree-usage.md
Last active March 24, 2025 17:21
A real world usage for git subtrees.

Let's say you have an iOS project, and you want to use some external library, like AFNetworking. How do you integrate it?

With submodules

Add the project to your repo:

git submodule add [email protected]:AFNetworking/AFNetworking.git Vendor/AFNetworking

or something to that effect.

@alexrepty
alexrepty / gist:5183042
Created March 17, 2013 18:54
Useful macappstore:// links
Updates page: macappstore://showUpdatesPage?scan=true
Featured page: macappstore://itunes.apple.com/
Direct app link (1): macappstore://itunes.apple.com/app/id%@?mt=12 (ex. macappstore://itunes.apple.com/app/id537386512?mt=12)
Direct app link (2): macappstore://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=%@&mt=12 (ex. macappstore://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=537386512&mt=12)
@uliwitness
uliwitness / gist:5330743
Last active December 15, 2015 22:09
Macro-based implementation of objects as constants for Objective C. Could probably write code that auto-generates all the OCONSTANTI(a) macro calls based on the OCONSTANT(a) macros. But that wouldn't work for system headers.
#import <Foundation/Foundation.h>
#define PASTE(a,b) a ## b
#define OCONSTANT(a) @class a; extern a* PASTE(k,a); @interface a : NSObject @end
#define OCONSTANTI(a) @class a; a* PASTE(k,a) = nil; @implementation a +(void) load { PASTE(k,a) = [[a alloc] init]; } @end
@steipete
steipete / PSPDFUIKitMainThreadGuard.m
Last active May 27, 2024 12:11
This is a guard that tracks down UIKit access on threads other than main. This snippet is taken from the commercial iOS PDF framework http://pspdfkit.com, but relicensed under MIT. Works because a lot of calls internally call setNeedsDisplay or setNeedsLayout. Won't catch everything, but it's very lightweight and usually does the job.You might n…
// Taken from the commercial iOS PDF framework http://pspdfkit.com.
// Copyright (c) 2014 Peter Steinberger, PSPDFKit GmbH. All rights reserved.
// Licensed under MIT (http://opensource.org/licenses/MIT)
//
// You should only use this in debug builds. It doesn't use private API, but I wouldn't ship it.
// PLEASE DUPE rdar://27192338 (https://openradar.appspot.com/27192338) if you would like to see this in UIKit.
#import <objc/runtime.h>
#import <objc/message.h>
@nevyn
nevyn / TCAppDelegate.m
Created June 23, 2013 06:37
How to wait for multiple different-timed animations in a generic manner? A reply to http://inessential.com/2013/06/22/technical_notes_on_vespers_full-scree .
#import "TCAppDelegate.h"
// Let's use https://github.com/nevyn/SPAsync
#import <SPAsync/SPTask.h>
@interface UIView (SPTaskAnimations)
// Category that returns an abstraction representing an asynchronous operation, rather than just a raw block. We can use this abstraction later to compose multiple of them.
+ (SPTask*)task_animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations;
@end
@scaryguy
scaryguy / change_primary_key.md
Last active February 4, 2025 02:09
How to change PRIMARY KEY of an existing PostgreSQL table?
-- Firstly, remove PRIMARY KEY attribute of former PRIMARY KEY
ALTER TABLE <table_name> DROP CONSTRAINT <table_name>_pkey;
-- Then change column name of  your PRIMARY KEY and PRIMARY KEY candidates properly.
ALTER TABLE <table_name> RENAME COLUMN <primary_key_candidate> TO id;