引っ越しました。

このブログは引っ越しました。
今後は引越し先で更新を続けます。
新しいブログではソースコードにシンタックスカラーを付けているので見やすくなっていると思います。

こちらは数ヶ月後に削除しますのでよろしくお願いします。

2010年11月23日火曜日

引っ越しました。

間違いだらけの iPhone 開発備忘録へ引っ越しました。
以後はそちらで更新を続けます。

こちらは数ヶ月後に削除しますのでよろしくお願いします。

引越し先URL : http://programming.lugn-design.com/

2010年11月22日月曜日

cocos2dでの色々設定

RxRAppDelegate.mの
if( ! [director enableRetinaDisplay:YES] )
CCLOG(@"Retina Display Not supported");
の部分のコメントアウトをはずす。

また画面を縦に固定するなら同ファイルの
[director setDeviceOrientation:kCCDeviceOrientationLandscapeLeft];
をコメントアウト。

ランドスケープをオフにするなら
GameDonfig.hの
define GAME_AUTOROTATIONをkGameAutorotationNoneに設定する。

#define GAME_AUTOROTATION kGameAutorotationNone

またシーンなどの画面推移系で使うAPIが

CCFadeTransition
CCFlipAngularTransition
CCShrinkGrowTransition
CCMoveInBTransition
CCMoveInTTransition
CCMoveInLTransition
CCMoveInRTransition
CCFadeTRTransition
CCFadeUpTransition
CCFlipXTransition
CCFlipYTransition
CCPageTurnTransition
CCCrossFadeTransition

から

CCTransitionFade
CCTransitionFlipAngular
CCTransitionShrinkGrow
CCTransitionMoveInB
CCTransitionMoveInT
CCTransitionMoveInL
CCTransitionMoveInR
CCTransitionFadeTR
CCTransitionFadeUp
CCTransitionFlipX
CCTransitionFlipY
CCTransitionPageTurn
CCTransitionCrossFade

に変更されている。

cocos2D導入方法

cocos2dの導入方法。
こちらの cocos2dを使ったiPhoneアプリ制作を解説してみるが非常に分かりやすかったのですがいくつか戸惑った部分があるので引用しながら自分用メモ。

まずは有無をいわさずにcocos2D本体をダウンロードしましょう。
http://www.cocos2d-iphone.org/
(※2010/11/22時点では0.99.4が安定版です。この記事では0.99.4で行います。)

ダウンロードしたらとりあえず解凍しましょう。
基本的にダウンロードフォルダの中にあるはずです。
以下のコマンドをターミナルで打ち込みます。
(標準で$は入っているので「cd ~/Downloads」だけコピペして下さい。)

$ cd ~/Downloads
$ cd cocos2d-iphone-0.99.4 (※自分のダウンロードして解凍したフォルダ名。バージョンが違うと後ろの数字が変わりますので注意。)
$ ./install-templates.sh

この時macにパスワードをかけているとエラーが出るので「$ ./install-templates.sh」の代わりに
$ sudo ./install-templates.sh
を実行してあげるとインストール出来ます。
その際パスワードを求められるので自分のパスワードを入力してくださいね。

以上でxcodeにcocos2Dのテンプレートが追加されます。

導入はこれでOKですね。

参考URL cocos2dを使ったiPhoneアプリ制作を解説してみる

2010年10月24日日曜日

移行中

現在ブログを移行中です。
ある程度移行が完了しましたらまたお知らせします。

2010年7月12日月曜日

UIviewはUIViewControllerを知らない

ブログ移行しました。
新しいブログでのこの記事はUIviewはUIViewControllerを知らないこちらです。
シンタックスカラーなど導入しているのでソースコードが見やすくなっているはずなので是非っ。


UIView上でモーダルビューを実装しようとして必死にpresentModalViewController呼んでた。
先日ようやくViewDidLoadとInitWithFrameの違い覚えたばかりだというのに。

UIViewはUIViewControllerの存在を知らない。
ちぃ覚えた。

参考サイト
viewDidAppear/viewDidDisappearが呼ばれない

モーダルビューを表示した時に前のビューのツールバー、ナビゲーションバーが残る時の対処法

タイトル通りの症状。
この症状が出た人は恐らく下のソースと似たようなソースになってるんじゃないかと。
自分はTestViewClassでモーダルを呼び出したときにこの症状が出ました。

AppliNameAppDelegate.h
@interface AppliNameAppDelegate : NSObject  {
 UIWindow* window_;
 TestViewClass *testClass;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end
AppliNameAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

 // windowを自分で作成
 CGRect bounds = [[UIScreen mainScreen] bounds];
 window_ = [[UIWindow alloc] initWithFrame:bounds];

 testClass = [[[TestViewClass alloc]init]autorelease];
 
 UINavigationController *NavigationController =
  [[UINavigationController alloc] initWithRootViewController:testClass] ;
 
 [window_ addSubview:NavigationController.view];
 [window_ makeKeyAndVisible];
 
 return YES;
}

対処としてはAppliNameAppDelegate.mの下記の部分で
UINavigationController *NavigationController =
[[[UINavigationController alloc] initWithRootViewController:paging] autorelease];
NavigationControllerをautoreleaseしていたらこれを消してやる。
んでUINavigationControllerは.mじゃなく.hの方で宣言しておく。
deallocでreleaseするの忘れずにね。
これで新しくモーダルビューを表示した時にもちゃんとツールバーやナビゲーションバーが表示されるみたい。

TestViewClass上(呼び出した先)でモーダルを表示するとNavigationControllerのautoreleaseが動いて上手く処理されないのかも。

※追記
他の場所で同じような現象が起きたので例のごとく総当りでautorelease, release関係消してみたけど駄目でした。
今回の現象が起きたところは元々処理のさせ方が無理矢理だったからそれが原因なのかもしれないのですが。
とりあえずこの問題解決の糸口はrelease関係じゃないのかもしれません。
…という投げっぱなしな記事。

warning: class 'ClassName' does not implement the 'UI***Delegate' protocol の警告を消す

warning: class 'ClassName' does not implement the 'UI***Delegate' protocol
の警告を消す方法。

クラスの宣言を
@interface ClassName : UIViewController
から
@interface ClassName : UIViewController<UI***Delegate>
に変えるだけ。
<>は半角の<>に直してね。

参考サイト
・『UIActionSheet』を使う時にチョットはまった…。
・warning、error → 検索・翻訳で余計意味不明

2010年7月1日木曜日

UIButtonをクラス化

初級程度の知識しかないと意外と手こずったのでメモメモ。
自分の場合はScrollView上に貼り付けて使うことを想定しているので他の処理をするときは上手くいかないかもしれません。

大体こんな感じ。

@interface CButton : UIViewController {
 UIButton* button;
}
- (UIButton*)getButton;
@end
#import "CButton.h"

@implementation CButton

- (void)viewDidLoad : (NSString*)imageName : (CGPoint)center
{
 button = [UIButton buttonWithType:UIButtonTypeCustom];
 UIImage* img = [UIImage imageNamed: imageName];
 button.frame = CGRectMake( 0, 0, 128, 128 );
 [button setImage:img forState:UIControlStateNormal];
 [button setImage:img forState:UIControlStateHighlighted];
 [button addTarget:super.view.superview
  action:@selector(DidPushButton:)
  forControlEvents:UIControlEventTouchUpInside];
 button.center = center;
}

- (UIButton*)getButton
{
 return btn;
}
@end

以上です。
引数のimageNameはファイル名(UIButtonTypeRoundRectなど自分で用意した画像を表示しないなら省略)、centerはボタンの中心位置。
基本的に普通のUIButtonと変わらないです。
違うのはaddTarget。
addTargetはいつも通りのselfだとタップした時点でエラーで落ちます。
ScrollView上に描画するこの場合は自分より1個上のビュー(要するにScrollViewこと)のsuper.view.superviewを指定してやります。
よくよく考えると「ですよねー」な感じだけど気づくのに時間かかりました…。

あとはボタンのサイズや透過度など別途引数で渡してあげれば汎用性も上がるんじゃないじゃないかと。

※追記
この状態だとScrollView上で用意されてるDidPushButtonの処理になります。
…全然クラス化出来てなくね?
CButtonで宣言したDidPushButtonを処理させるにはどうすればいいだろう。

※追記
複数の違う処理をするボタンはTagを使うといいみたいです。
button.tagでそれぞれの処理に振り分ける、みたいなやり方。

2010年6月28日月曜日

ModalViewにNavigationControllerを追加する方法

ブログ移行しました。
新しいブログでのこの記事は ModalViewにNavigationControllerを追加する方法 こちらです。
シンタックスカラーなど導入しているのでソースコードが見やすくなっているはずなので是非っ。


通常のモーダルは
ModalView* dialog = [[[ModalView alloc] init] autorelease];
dialog.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:dialog animated:YES];
でモーダルに推移する。
このモーダルにナビゲーションバーを追加表示する。
方法は超簡単。
ModalView* dialog = [[[ModalView alloc] init] autorelease];
dialog.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
UINavigationController *NavigationController =
[[UINavigationController alloc] initWithRootViewController:dialog];
[self presentModalViewController:NavigationController animated:YES];
以上でおk。
あとはバーのカスタマイズでボタンを色々追加すると良いよ。

っていうかUINavigationControllerにモーダルビューだろうとラベルビューだろうと突っ込んでおけばとりあえずナビゲーションバーは表示されるはず。
…はず。

UIGestureRecognizerまとめ?

ブログ移行しました。
新しいブログでのこの記事はUIGestureRecognizerまとめ?こちらです。
シンタックスカラーなど導入しているのでソースコードが見やすくなっているはずなので是非っ。

OS3.2以降のOSで対応。
つまりiPadかiOS4が入ったiPhoneじゃないと動かない。
でも涙が出るくらい便利。

UITapGestureRecognizer : タップ(タップの数は任意で取得)
UIPinchGestureRecognizer : ピンチインとピンチアウト(拡大縮小用。二本指でくぱぁするアレ)
UIPanGestureRecognizer : パニング(ドラッグのこと)
UISwipeGestureRecognizer : スワイプ(ページ送りなど。ドラッグと似てる?)
UIRotationGestureRecognizer : 回転(指二本での回転)
UILongPressGestureRecognizer : 長押し(safariの新規タブを開くときに使うなど)

使い方は簡単。
タップの場合はUITapGestureRecognizerのインスタンスを作成してactionで動作したときに飛ぶ関数の指定。
あとはnumberOfTapsRequiredでタップの回数を指定。
ビューに追加して終わり。

以下ソース。
これはダブルタップの場合です。
UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(DetectionDoubleTap:)];
tapRec.numberOfTapsRequired = 2;
[self.view addGestureRecognizer:tapRec];
[tapRec release];
んで後はタップ判定後に飛ぶ実際の処理をする関数を作るだけ。
- (void)DetectionDoubleTap:(id)sender {
NSLog(@"DoubleTap!");
}
これでおk。

独自のUIをUIViewで作ったものにも簡単にタップやジェスチャを実装できるのはいいね。

ちなみにScrollView上に追加したUIButtonとどっちが優先されるかやってみた。
結果的にはタップ回数が1回の判定時はUIGestureRecognizerが優先されました。
ダブルタップ時はボタンが優先されました。
まぁダブルタップはともかくシングルタップ時はUIGestureRecognizerが優先されるみたいです。

2010年6月25日金曜日

iphone The bundle identifier cannot be changed from the previous minor version.の解決ヒント

iphone The bundle identifier cannot be changed from the previous minor version.
はその名の通りbundle identifierが原因。

このエラーが出たらとりあえずバイナリ(アプリ本体)のアップロードは後にして他のを進める。
バイナリ以外をアップロードしたらWaiting For Upload状態になるはず。
この時アプリ管理画面にApp Detailsの項目があるはずなのでそのリンクをクリックするとBundle Identifierという項目がある。
とりあえずその横に表記されてる文をコピー。
xcodeを開いてplistを開く。
Bundle Identifierの項目にさっきコピーした文をペースト。
その状態でアップロード。
私はその状態で無事完了しました。

2010年6月23日水曜日

iPhoneのUiKitの表示サイズ

それぞれ高さが
ナビゲーションバー 44px
タブバー 48px
ステータスバー 20px
残り 368px

2010年6月21日月曜日

画像のメモリ削減管理

複数の、それも大量の画像を扱う場合の話。
メモリ的に効率のよい管理、なのでUIImageViewにすべての画像を読み込んでaddSubViewで表示、はもちろん却下。
UIImageviewは数個に抑えておく。

もっと効率のよいやり方はあるだろうけど自分の場合は下記の方法でやりました。
NSString  *imageName = [NSString stringWithFormat: @"img" ];
NSString  *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
UIImage* img = [[UIImage alloc] initWithContentsOfFile:imagePath];
UIImageView* viewImage = [[[UIImageView alloc] initWithImage:img] autorelease];
初期化は上記の方法でおk。
※以前公開していたコードはミスがあったので修正しました。

処理の途中での画像の差し替えは下記の方法。
viewImage.image = nil;
NSString *imageName = [NSString stringWithFormat: @"img2"];
NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
img = [[UIImage alloc] initWithContentsOfFile:imagePath];
viewImage.image = img;
viewImage.contentMode = UIViewContentModeScaleAspectFill;
[img release];
とすればOK。
contentModeは画像を差し替えても初回に読み込んだアスペクト比で画像を表示してしまうので色々なアスペクト比のものを扱う場合はここでリセットしておく。
プロパティの値はここを参照。
http://d.hatena.ne.jp/rnamiki/20090226/1235667228

複数のviewを扱う場合は表示する(画面に写る)画像以外はhiddenプロパティをオフにしておく。
これで大体はおkなんじゃないかなぁ。

参考サイト
iPhone 開発 画像ロード方法3種まとめ

2010年4月30日金曜日

設定しておくと便利なカスタマイズ

http://iphone.longearth.net/2009/08/09/【xcode】設定しておくと便利なカスタマイズいろい/

2010年2月19日金曜日

エラー メッセージ

*** not declared in this scope
scodeで新規にC++ファイルを作成すると拡張子が.cppになるので注意。
このままだとライブラリ(自分の場合はM_PIなどの数学ライブラリ)が "*** not declared in this scope"と出て使用出来ない。
拡張子を.mmに直しておく。


ISO C++ forbids declaration of '*' with no type
これは「ISO C++ は、タイプ指定のないXXXX宣言を禁止しているんだぞ」ということ。
インポートした後に
@class ClassName
で解決おk!

2010年2月3日水曜日

ショートカット

基本的なショートカット。

esc コードヒント
ctrl + , コードヒント
ctrl + . 補完を実行
cmd + / 選択している行を//でコメントアウトorコメントアウトを解除
cmd + [  インデントを下げる
cmd + ]  インデントを上げる
cmd + shift + F プロジェクト内検索
cmd + shift + J リファクタリング
cmd + L  指定行に移動
cmd + shift + enter
ワードの上で cmd + ダブルクリック ワードの定義へジャンプ
ワードの上で alt + ダブルクリック ワードのヘルプへジャンプ
cmd + option + 上キー .h/.mファイルの切り替え

cmd + B     ビルド
cmd + shift + K  クリーニング
cmd + enter   ビルドして実行
cmd + alt + P 一時停止/続ける
cmd + \ ブレークポイントON/OFF

参考サイト
xcode ショートカット

2010年1月29日金曜日

iPhone 基本

ここにiPhone SDKで学んだ超絶基本的なことを書いていく。
今回はIB使用。
次回からはIB排除の方向で!

□ ステータスバーの非表示
書類ビューで"View"を選択してStatus Barの項目をNoneにするとステータスバーが非表示になる。


□ 画面を横にしたい。
Classesの"Project Name.m"のコメントアウトされている
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

// この返り値が開始時のビューの向きを変更している
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

の部分を上記に置き換えるとホームボタンを右にした状態の横画面になる。


□ビュー毎の色分け

ビュー毎にラベルや実際に色付して管理すると見やすい(…かも)。

ビューに色をつけた場合、後から画像などを登録した時にインスペクラウィンドウのBackGroundからOpacityを0%にしておくと色が透明になる。