‘iPhone/iPad’ カテゴリーのアーカイブ
長崎国体・大会アプリがリリースされました!
- 2014/05/16
- yoshida
AutoLayoutをiOS5にbackportするRRAutoLayout
- 2013/07/23
- yoshida
iOS6で導入されたAutoLayout。正しく使えば3.5inchでも4inchでも怖くない!しかし当然iOS5以前では使えません。。。2013年7月現在でも、iOS5を使用されてるユーザは全体の1割程はいるようで、切るにも切れないこともあるかと思います。
そこでRRAutoLayout、素晴らしすぎます。
セットアップにはハマりませんでしたが、思ったような表示にならなかったので色々触っていると、次のようなことに注意すれば良いことが分かりました。
Storyboard上で、例えばViewの最上部に置きたい画像がある場合、通常ImageViewをドラッグして、Viewの最上部に置くと思いますが、この際自動でConstraintsが設定されるかと思います(SuperviewとのVertical Spaceが0など)。この自動でできるConstraintsだとRRAutoLayout は認識してくれないので、あくまでも手動でのConstraintsに変換してやります。(ImageViewのHeightなども含め)
まだ多くのViewを定義してみたわけではありませんが、これで効率よく開発できそうです。
Objectve-Cでクラスのインスタンスメソッドを書き換える
- 2013/02/22
- yoshida
つい最近まで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です。
NSDictionaryのdictionaryWithObjectsAndKeysが辛い
- 2013/02/14
- yoshida
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"
}
]
};
ちょっとは見やすくなりますね!