ラベル cocoa の投稿を表示しています。 すべての投稿を表示
ラベル cocoa の投稿を表示しています。 すべての投稿を表示

2012年8月7日火曜日

UIViewをcocos2dに配置する

どうも、俺@残業中です。
久々のエントリー。仕事サボってた訳ではございません^^;バタバタしてました!


今日はUIViewをcocos2dで利用する場合のメモメモです。

UIView *myView = [UIView alloc] init];
[[[CCDirector sharedDirector] openGLView] addSubView:myView];
簡単ですね。

cocos2dでゲームアプリを開発しながら、UIViewなオブジェクトを貼り付けたいとき!はこの方法でOK!


以上でぇぇぇえぇす!


2012年3月23日金曜日

CGRect、CGSize、CGPointについて

どうも、俺@絶賛開発中です。
今日は(も)Objective-Cについてです。最近はアプリ(iOS/Android)関連の仕事が多いですね。

Objective-Cで開発してるとよくCGRectやCGPoint、CGSizeなどといったクラス(構造体)を使います。
これについてメモメモ。
ゲームアプリなど座標を細かく管理する開発では必須の知識です。

■CGRect
オブジェクトの座標とサイズを管理します。
// 座標(100, 100)の位置に横50 x 縦50のサイズを表すCGRect
CGRect rect = CGRectMake(100, 100, 50, 50);


■CGPoint
オブジェクトの座標を管理します。
//座標(200, 100)の位置を表すCGPoint
CGPoint point = CGPointMake(200, 100);


■CGSize
オブジェクトのサイズを管理します。
// 横200 x 縦100のサイズを表すCGSize
CGSize size = CGSizeMake(200, 100);


またこれらをコンソール上にログ出力する場合は、

CGRect rect = CGRectMake(0, 0, 30, 30);
NSLog(@"%@", rect);
のようにしても出力されません。

座標情報やサイズをログ出力させるには、
NSStringFromCGRect()
NSStringFromCGPoint()
NSStringFromCGSize()
これらを使います。

CGPoint point = CGPointMake(100, 200);
NSLog(@"%@", NSStringFromPoint(point));


以上でぇぇぇえぇす。

2012年2月9日木曜日

NSLocalizedStringとstringWIthFormatを使ってiPhoneアプリの多言語化

どうも、俺@仕事中です。
今日はiPhoneアプリをNSLocalizedString()とNSString stringWithFormatを使って多言語対応する方法のめもめもです。

日本語環境のみに作ったアプリを
NSString *str = @"にほんご";
英語圏で使うようにするには

NSString *str = NSLocalizedString(@"key", @"comment");
としておき、ターミナルから

genstrings -a $(find ./ -name "*.m");
とすればLocalizable.stringsファイルができるので、Xcode内にドラッグ&ドロップ(Xcode4では「Supporting Files」が適当かな)します。
Localizable.stringsはUtilitiesのFile Inspectorから作成する言語とText−Encoding(UTF-16)を設定します。
Localizable.strings内では
・Localizable.strings(English)
"key" = "Japanese;"

・Localizable.strings(Japanese)
"key" = "にほんご"
としておけば、"key"と記述した部分をそれぞれの言語に変更してくれます。
※ここでは"Japanese"と"にほんご"に置換してくれる。

これら詳しい説明は
NSLocalizedStringでiphoneアプリ多言語対応 Xcode4 - はるかなる熊がとても参考になりました。


ところで、英語と日本語では文法的に単語の出てくる順番が異なるときが出てくる。
例えば
私は「テトリス」で「100」pt取った。
という日本語を英語にすると
I took 「100」pt in 「Tetris」.
となる。「」で囲まれた単語が異なる場合がある。
こういう場合、まずobjective-cのソースコードでは英語に合わせて作ったほうが分かりやすい。

NSString *str = [NSString stringWithFormat: NSLocalizedString(@"long sentence", @"some comment"), @"100", @"Tetris"]
こうしておいた上で、それぞれのLocalizable.stringsでは
・Localizable.strings(English)
"long sentence" = "I took %d pt in %@.";

・Localizable.strings(Japanese)
"long sentence" = "わたしは%$2@で%1$d取った。";
とする。
stringWithFormat の%$n@でフォーマットに入れる変数の順番を変更できるのです。(nは整数)


以上でぇぇぇぇぇぇす。

2012年1月20日金曜日

UIViewのアニメーションで画面遷移

どうも、俺@仕事中です。久々のObjective-Cです。
アプリでUINavigationControllerを使わずに画面をアニメーションさせて遷移させる方法を調べたのでメモメモ。

右から左へスライドインする処理
■元画面(FirstView: UIVIewControllerを継承)
// 遷移先UIViewを画面外に生成(SecondView: UIVIewを継承)
secondView = [[SecondView alloc]initWithFrame:CGRectMake(self.view.frame.size.width + 1, 0, self.view.frame.size.width, self.view.frame.size.height)];

// アニメーション開始
[UIView beginAnimations:nil context:nil]:
[UIView setAnimationDuration:0.5]; // 0.5秒かけて
[UIView setAnimationCure:UIViewAnimationCurveLinear]; // 一定速度で
[self.view addSubview:secondView]; // addSubviewする

secondView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); // 画面内へ動かす
[UIView commitAnimations]; // アニメーションコミット
これで右から画面内へスライドインする遷移ができます。

今度は戻るボタンなどで元画面へ戻る処理です。
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLInear];
[UIView setAnimationDelegate:self]; // デリゲートをselfで指定
[UIView setAnimationDidStopSelector:@selector(animationStopped:finished:context:)]; // アニメーションが完了した時の処理

secondView.frame = CGRectMake(self.view.frame.size.width + 1, 0, self.view.frame.size.width, self.view.frame.size.height); // 画面外へ
[UIView commitAnimations];
/**
 * アニメーション停止後の処理
 */
- (void)animationStopped:(NSString *)animation finished:(BOOL)finished context:(void *)context
{
  [secondView removeFromSuperview]; // secondViewをremoveFromSuperviewする
}
こうなります。
secondViewをremoveFromSuperviewする場合は、UIViewのsetAnimationDidStopSelectorを使ってアニメーション停止後の処理をセレクターを使って処理させて下さい。そうしないとアニメーションが動きません。
またその場合はUIViewのsetAnimationDelegateメソッドを呼んでおく必要があります。
以上でぇぇぇぇぇぇす。

2011年11月12日土曜日

NSNumberとNSValueとCGRect,CGPoint,CGSIzeについて

どうも、俺@家帰っても勉強中です。
Objective-CでNSNumberとNSValueという不思議なクラスにぶち当たりました。

NSNumberは数値を表すオブジェクト型で、プリミティブなintやNSIntegerとは少し意味合いが違います。
つまりintとNSIntegerはイコールですが、NSNumberはイコールではありません。
使い方は
int i = 10;
NSInteger i = 10;
NSNumber *i = 10;
のようになります。
使いどころですが、例えばオブジェクト型で数値を表現したい場合はNSNumberを、そうでない場合はintやNSIntegerを使いましょう!というそのままなのですが、
具体的には、NSArrayなどに格納できる要素はオブジェクト型である必要があります。
NSArrayやNSMutableArrayにどうしても数値を格納する必要があれば、NSNumberを使えばOKです。

int i =10;
NSNumber *num = [NSNumber numberWithInt: i];
としてやればintをNSNumber型に変換できます。
他にも
NSNumber *num = [NSNumber numberWithFloat: 10.0f];
のような使い方もできます。
逆にNSNumber型をint型として取り出すには
int i = [num intValue];
でOKです。

またNSValueですが、これはCGRectやCGPoint、CGSizeなど構造体を表すオブジェクト(NSObjectを継承していない)を扱う場合に利用します。
CGRectとかCGPointなどはクラスの引数の型などに設定できないんですね。あとは上の例のように、NSArrayの要素として追加したい場合など。
CGrect rect = CGRectMake(0, 0, 100, 100);
NSValue *val = [NSValue valueWIthCGRect:rct];
CGPoint point = CGPointMake(100, 100);
NSValue *val = [NSValue valueWIthCGPoint:point];
CGSize size = CGSizeMake(100, 100);
NSValue *val = [NSValue valueWIthCGSIze:size];
こんな感じです。

逆にNSValue型のオブジェクトからCGRectなどを取り出す場合は
CGRect rect = [val CGRectValue];
CGPoint point = [val CGPointValue];
CGSize size = [val CGSizeValue];
使い方はNSNumberの場合とほとんど一緒です。


以上でぇぇぇぇす。

2011年11月10日木曜日

UIView UILayout UITextViewを角丸にする

どうも、俺@アプリ開発中です。
今日はタイトル通り「UIView」「UILayout」「UITextView」の角を丸く描画する方法についてめもめもです。

まず、ヘッダファイルで

#import <QuartzCore/QuartzCore.h>
とQuartzCore.frameworkをインポートします。
別のサイトとかではQuartzCore.frameworkを追加して、とかあるのですが僕の環境ではそんなことしなくても普通に使えました。
なぜだ。(XCode4.2)
次に対象のオブジェクトに対し

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(100, 100, 50, 50);
[btn setTitle:@"test" forState:UIControlStateNormal];

// 角丸の処理
[[btn layer] setCornerRadius:5.0f];

// または
// btn.layer.cornerRadius = 5.0f;
こんな感じです。
UILayoutやUITextViewでも同様に作れます。


以上でぇぇぇえす。

2011年11月9日水曜日

Objective-Cでprivateメソッドを定義したい

どうも、俺です。
ようやくobjective-c(cocoa)な話題です。

objective-cで自作クラスを作り、javaやphpのようにprivateなメソッドを定義したい!という時のめもめもです。
objective-cは基本的には定義されたメソッドはpublicになってしまいます。
面倒なのであえてprivateなメソッドにする必要もなさそうですが。

ちなみにprivateなプロパティは

// MyClass.h
@interface MyClass: NSObject
{
 @private
   id hoge;
}
-(void)methodA;
@end
のような形で定義できちゃいます。

privateなメソッドを定義するには、カテゴリを使って何とか実装できます。、、なので面倒です。

// MyClass.m
@interface MyClass () // ←が無名カテゴリの定義
-(void) privateMethod;
@end

@implemention MyClass
// ここにクラスの実装を行う。
// privateMethodもここに作成する。
-(void) prrivateMethod
{
  // メソッドの内容
}
@end
こんな感じです。
MyClasss.hに変更を食わえる必要はありません。

Objective-Cにprivateメソッドの仕組みが組み込まれてないんでしょうね。
なんか冗長な気がするので、どうしてもprivateじゃないとアカン!という場合でなければ使わなくても良いかなと思いました。
アプリ開発とかでもあまり大規模開発になることもなさそうですし。

以上でぇぇぇぇぇぇぇす。