TOKOROM BLOG

iOSとかVimとかその他日々の雑多な技術情報

UIKitで使われている画像パーツをまとめて取得する はてなブックマーク - UIKitで使われている画像パーツをまとめて取得する

Permalink

UIKitで使われている画像はどこにある?

例えば、UIAlertViewのアラートの画像ってどういう構成になってる?とかUISegmentedControlのAppearance変えたいんだけど当てはめる画像はどう作る?などというときにUIKitが標準で使っている画像パーツを参照できると便利です。

プログラマというか特にはデザイナさんにとって有用だと思います。

その画像パーツですが、Xcode(iOSシミュレータ)の中に入っているのでそこから抜くのが手っ取り早いです。
具体的には(これはiOS6.1の場合)、

1
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Frameworks/UIKit.framework/Shared@2x.artwork

が画像パーツを含むファイルになります。

他にも、同じディレクトリに

  • Shared.artwork
  • Shared@2x~ipad.artwork
  • Shared@2x~iphone.artwork
  • Shared~ipad.artwork
  • Shared~iphone.artwork

がありますので取りたいものに応じてお好みで。

ひとまず、

1
cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Frameworks/UIKit.framework/Shared@2x.artwork ~/Desktop/

などでこのファイルをデスクトップにでもコピーしておきましょう。

artworkから画像ファイルを抽出

で、artworkから肝心の画像ファイルを抽出するのに、 iOS-artwork というやつを使わせてもらいます。

まずは、これを

BlockInjectionをバージョンアップしました はてなブックマーク - BlockInjectionをバージョンアップしました

Permalink

BlockInjectionとはなんぞや

Objective-Cの特定のメソッドの前後に処理を追加できるライブラリです。
クラスの外側からアスペクト指向的に振る舞いを追加できるのが特徴です。

https://github.com/tokorom/BlockInjection で公開しています。

バージョンアップ内容

前記事 からのバージョンアップ内容は以下です。

  • リファクタリングしてメソッド名が一式変更になりました(これまでのものはDeprecatedですがまだ使えます)
  • クラスメソッドにも対応しました
  • 複数のクラスやメソッドを一度に追加できるようになりました
  • 正規表現で指定できるようになりました(※1)
  • 注入したBlockの中で注入先のメソッド名を取得できるようになりました(※2)
  • オマケで単純なメソッド実装置き換え機能も追加しました

UIViewの勝手に呼ばれているsetterでまとめて全てログ出力させる

BlockInjectionで元のソースコードを汚さないで振る舞い追加 はてなブックマーク - BlockInjectionで元のソースコードを汚さないで振る舞い追加

Permalink

例えばこんなコードに違和感はありませんか?

自分の場合よくあることなのですが、例えばiOSアプリを開発していて、Google Analytics のトラッキングのためのコードを加えるとき、

1
2
3
4
5
6
7
8
9
10
11
12
- (IBAction)sendButtonDidPush:(id)sender
{
  // トラッキングのためのコード
  [tracker sendEventWithCategory:@"uiAction"
                      withAction:@"sendButtonDidPush"
                       withLabel:nil
                       withValue:0];

  // ...
  // 以降、送信ボタンを押したときの処理
  // ...
}

こんなかんじにボタンが押されたときの処理のところにトラッキングのためのコードを埋め込んだりすると思います。

これはこれで問題はないのですが、プログラムのあちらこちらにトラッキングのためのコードを埋め込んで、本来の処理のコードを汚してしまっているのに違和感がありました。

どうにかしてトラッキングのためのコードを外出しに(また、理想的にはどこかにひとまとめに)できないものでしょうか?
いわゆるアスペクト指向的なかんじで。

そんなときに BlockInjection

ということで本題に入りますが、それを解決するために BlockInjection というライブラリを作りました。
古くは AspectCocoa だったりいくつかそれっぽいのはあったのですが、いずれも古い、大きすぎるなどの理由で適切なものが見つからなかったため、この目的に特化したライトなやつとして作っています。

例えば、上記のコードの場合、こんなかんじで外側から処理を埋め込めます。

tmuxでC-t C-tでのサイクルをより便利にする : 同じキーでpaneでもwindowでも行き来できるようにしてみた はてなブックマーク - tmuxでC-t C-tでのサイクルをより便利にする : 同じキーでpaneでもwindowでも行き来できるようにしてみた

Permalink

※tmuxのprefixキーが C-t 以外のかたはそのキーに読み替えをお願いします

導入

近頃の開発環境 : Mosh、z、tmux、Emacs、Perl について を読んで自分もC-t C-tでtmuxのペイン(pane)を行ったり来たりというのを真似してみた。

設定は以下のとおり。

  • .tmux.conf
1
bind C-t last-pane

これでpaneが複数ある場合には C-t を連打するだけで2つのpaneを行ったり来たりでき確かに便利。

ただ、じつはこの真似をする前には C-t C-t には last-window を割り当てており、paneを使っていないケースではそれはそれで便利だった。

例えば、設定を変えたことによって、paneなしで2つのwindowで作業しているときに C-t C-t で2つのwindow行き来しようと思ったらエラーとなりけっこうストレスがあったりした(慣れれば大丈夫なんでしょうけど)。

改善

ということで、

  • paneがあれば last-pane
  • paneがなければ last-window
  • ついでにwindowさえもなければ新しいwindowを作って移動

VimでiOSのリファレンスを直接参照したい → CtrlPの拡張でできるようになりました はてなブックマーク - VimでiOSのリファレンスを直接参照したい → CtrlPの拡張でできるようになりました

Permalink

Vimでリファレンス読む必要ありますか?

正直微妙なところでしょうか。
自分の場合、 Dash があればVimで直接にリファレンスAPIドキュメントとか)を見れなくてもそんなには困ってないです。

ただ、せっかく前の記事でVimでObjective-Cのコード補完をできるようにしたので、リファレンスもVimで参照できるようにしてみたいと思います。

  • Vimでさらっと検索してリファレンスから関数をコピー
  • そのままプログラミングにペースト

というのをキーボードから手を離さずに手早くできるというメリットはありそうです。

※ ただ、がっつりドキュメント読むときはやはりDashとか使ったほうが良いと思います

Docsetを検索するCtrlPのエクステンションを作りました

ctrlp-docset というpluginを作りました。
オフィシャルのiOSのドキュメント(iOS 6.0 Library)は Docset 形式になっているので、そのDocsetをVimから参照するイメージです。
なのでiOS専用というわけではなく、Docsetならなんでも参照可能です。

vim-refと迷いましたが、CtrlP を使ってみたかったのでCtrlPのエクステンションとして作成しました。

CtrlPについては、

あたりがわかりやすかったです。

インストールして動かすと、

ctrlp_docset.jpg

といったかんじで、クラスやメソッドをインクリメンタル検索できるようになります。