This gist shows how to create a GIF screencast using only free OS X tools: QuickTime, ffmpeg, and gifsicle.
To capture the video (filesize: 19MB), using the free "QuickTime Player" application:
| static inline BOOL CBIsEmpty(id obj) { | |
| return obj == nil | |
| || (NSNull *)obj == [NSNull null] | |
| || ([obj respondsToSelector:@selector(length)] && [obj length] == 0) | |
| || ([obj respondsToSelector:@selector(count)] && [obj count] == 0); | |
| } |
| // | |
| // NSUserDefaults+ObjectSubscripting.h | |
| // | |
| // Created by Tony Arnold on 29/07/12. | |
| // Copyright (c) 2012 The CocoaBots. All rights reserved. | |
| // | |
| #import <Foundation/Foundation.h> | |
| @interface NSUserDefaults (ObjectSubscripting) |
| ########################################## | |
| # | |
| # c.f. http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4 | |
| # | |
| # Version 2.82 | |
| # | |
| # Latest Change: | |
| # - MORE tweaks to get the iOS 10+ and 9- working | |
| # - Support iOS 10+ | |
| # - Corrected typo for iOS 1-10+ (thanks @stuikomma) |
| // | |
| // UIImage+H568.m | |
| // | |
| // Created by Angel Garcia on 9/28/12. | |
| // Copyright (c) 2012 angelolloqui.com. All rights reserved. | |
| // | |
| #import <objc/runtime.h> | |
| @implementation UIImage (H568) |
| #! /usr/bin/python | |
| # | |
| import sys | |
| import os | |
| import tempfile | |
| from Quartz.CoreGraphics import * | |
| from os.path import splitext | |
| from os.path import basename | |
| from os.path import join |
| #import "FileChangeObserver.h" | |
| #undef Assert | |
| #define Assert(COND) { if (!(COND)) { raise( SIGINT ) ; } } | |
| @interface FileChangeObserver () | |
| @property ( nonatomic, readonly ) int kqueue ; | |
| @property ( nonatomic ) enum FileChangeNotificationType typeMask ; | |
| @end |
| 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; |
| // 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> |
| http://devstreaming.apple.com/videos/wwdc/2013/710xfx3xn8197k4i9s2rvyb/710/710-HD.mov?dl=1 | |
| http://devstreaming.apple.com/videos/wwdc/2013/202xdx2x47ezp1wein/202/202-HD.mov?dl=1 | |
| http://devstreaming.apple.com/videos/wwdc/2013/200xdx2x35e1pxiinm/200/200-HD.mov?dl=1 | |
| http://devstreaming.apple.com/videos/wwdc/2013/413xdx5x97itb5ek4yex3r7/413/413-HD.mov?dl=1 | |
| http://devstreaming.apple.com/videos/wwdc/2013/612xax4xx65z1ervy5np1qb/612/612-HD.mov?dl=1 | |
| http://devstreaming.apple.com/videos/wwdc/2013/221xex4xxohbllf4hblyngt/221/221-HD.mov?dl=1 | |
| http://devstreaming.apple.com/videos/wwdc/2013/220xbx4xipaxfd1tggxuoib/220/220-HD.mov?dl=1 | |
| http://devstreaming.apple.com/videos/wwdc/2013/711xcx4x8yuutk8sady6t9f/711/711-HD.mov?dl=1 | |
| http://devstreaming.apple.com/videos/wwdc/2013/404xbx2xvp1eaaqonr8zokm/404/404-HD.mov?dl=1 | |
| http://devstreaming.apple.com/videos/wwdc/2013/505xbx4xrgmhwby4oiwkrpp/505/505-HD.mov?dl=1 |