GlitchKit - iOS でカジュアルにグリッチできるライブラリ

本日、社内外の iOS/Android 向け Tips 共有会、#potatotips 第二回 で、「XXXKit -それははしかのような物-」という内容を発表した。

最近 iOS (Objective-C) を今更ながらに学び始めたんだけど、新しい事を学んで今まで知らなかった/興味深いパラダイムがあると、それにどっぷりつかりがちで、それを プログラマにおけるはしか 、と言ったりする。

その中でかじってすぐに興味深いと感じたのは Objective-C の"カテゴリ"で。これはヘッダを import するだけ(実際は import するしない関わらずリンクされた時)で、様々なオブジェクトのクラスの挙動を拡張できる。Ruby における mixin + refinements のような物だし、Perl でも use して特定のオブジェクトの挙動を変えることが出来るが、Objective-C を学ぶまで、このようなことができることを知らなかった。

またこの "カテゴリ" と組み合わせて、標準のオブジェクトや UIKit といったフレームワークを拡張することができる XXXKit という語尾に Kit をつけたライブラリがある。たとえば EnumeratorKit なんかは、NSArray や NSDictionary で、Ruby の Enumerator 的なコードを書くことができるようになる。もちろんこれらは意図しない動作を引き起こす可能性もあるため、多用すると危険なのだが、そこは便利さとトレードオフなので、どうしてもオレオレ XXXKit を作りたくなる衝動がでてくる。

そのため、"カテゴリ" と "XXXKit" は Objective-C におけるはしかのようなものだなぁ、と感じた。と言うわけでカテゴリ使って Glitch する XXXKit を作ってみた。

Podfile に追加する

pod 'GlitchKit'

 

before glitch

UIImageView -glitch でグリッチ

#import "GlitchKit.h"

// glitch!
[uiImageView glitch];

   after glitch

簡単便利

UIImageView -glitchWithBlock: でグリッチ

好きなようにグリッチさせる

// apply custom glitch
[uiImageView glitchWithBlock:^int(int byte, int index, uint length, Byte *bytes) {
  return (byte == 42 && arc4random() % 3 == 1) ? 0 : byte;
}];

 

after glitch3

簡単便利

他にもUIImage クラスで以下が使えるようになる。

  • (UIImage *)glitch;
  • (UIImage )glitchWithBlock: (int (^)(int byte, int index, uint length, Byte bytes)) block;
  • (NSData *)glitchData;
  • (NSData )glitchDataWithBlock: (int (^)(int byte, int index, uint length, Byte bytes)) block;

どうぞカジュアルにごりようください。