‘iPhone/iPad’ カテゴリーのアーカイブ

yoshida

長崎国体・大会アプリがリリースされました!

長崎がんばらんば国体・長崎がんばらんば大会実行委員会様提供、弊社設計・開発による長崎国体アプリがリリースされました!
競技の日程や組合せ、会場付近の施設など、観戦をトータルにサポートするアプリになっております。
5月24・25日はリハーサル大会も開催されますので、是非ダウンロードしてください!

yoshida

AutoLayoutをiOS5にbackportするRRAutoLayout

iOS6で導入されたAutoLayout。正しく使えば3.5inchでも4inchでも怖くない!しかし当然iOS5以前では使えません。。。2013年7月現在でも、iOS5を使用されてるユーザは全体の1割程はいるようで、切るにも切れないこともあるかと思います。

そこでRRAutoLayout、素晴らしすぎます。

RolandasRazma/RRAutoLayout 

セットアップにはハマりませんでしたが、思ったような表示にならなかったので色々触っていると、次のようなことに注意すれば良いことが分かりました。

Storyboard上で、例えばViewの最上部に置きたい画像がある場合、通常ImageViewをドラッグして、Viewの最上部に置くと思いますが、この際自動でConstraintsが設定されるかと思います(SuperviewとのVertical Spaceが0など)。この自動でできるConstraintsだとRRAutoLayout は認識してくれないので、あくまでも手動でのConstraintsに変換してやります。(ImageViewのHeightなども含め)

まだ多くのViewを定義してみたわけではありませんが、これで効率よく開発できそうです。

yoshida

Objectve-Cでクラスのインスタンスメソッドを書き換える

つい最近までiOS用のコードを書いていたのですが、その中でとあるオープンソースのライブラリを使用しています。でその中のとあるインスタンスメソッドの処理を書き換える必要がありました。
カテゴリ使って書き換えようと思ったのですが、その処理自身がカテゴリで定義されていたため無理でした。

まあライセンスに問題なければソースを直接修正すれば良いのですが、ライブラリのアップデートとかに備えておきたいとこです。
そこでclass_replaceMethodを使って書き換える方法に落ち着きました。

//ExampleClassのexampleMethodを書き換える例

#import
...

id class = [ExampleClass class];//クラス定義取得
SEL sel = @selector(exampleMethod);//セレクタ取得

void (^block)() = ^{
//処理を書き換える
};

IMP imp = imp_implementationWithBlock(block);//BlocksからIMPを生成

Method method = class_getInstanceMethod(class, sel);//元のインスタンスメソッドを取得
char* types = method_getDescription(method)->types;//インスタンスメソッドの引数の型を取得
class_replaceMethod(class, sel, imp, types); //書き換え!

これをAppDelegateなんかで実行しておけばOKです。

yoshida

NSDictionaryのdictionaryWithObjectsAndKeysが辛い

iOS開発をやっていて、NSDictionaryでよく使うdictionaryWithObjectsAndKeys、NSArrayのarrayWithObjectsですが、下記のように入れ子になってくると何のこっちゃ分からなくなります。

NSDictionary *dictionary1 = [NSDictionary dictionaryWithObjectsAndKeys:
@"Taichiro", @"firstname",
@"Yoshida", @"lastname",
[NSArray arrayWithObjects:
[NSDictionary dictionaryWithObjectsAndKeys:
@"twitter", @"type",
@"dataich", @"id",
nil
],
[NSDictionary dictionaryWithObjectsAndKeys:
@"facebook", @"type",
@"dataich", @"id",
nil
],
nil],
@"accounts",
nil
];

NSLogで出力した結果を見ると、下記のようなシンプルな内容なのですが。

{
accounts = (
{
id = dataich;
type = twitter;
},
{
id = dataich;
type = facebook;
}
);
firstname = Taichiro;
lastname = Yoshida;
}

これをもう少し簡単にかける方法があります。
dictionaryWithObjectsAndKeysには @{}
arrayWithObjectsには @[]
というリテラル?が用意されてます。
これを使って書き直すと下記のようになります。

NSDictionary *dictionary2 = @{
@"firstname" : @"Taichiro",
@"lastname" : @"Yoshida",
@"accounts" : @[
@{
@"type" : @"twitter",
@"id" : @"dataich"
},
@{
@"type" : @"facebook",
@"id" : @"dataich"
}
]
};

ちょっとは見やすくなりますね!