Mac Book Airを手に入れてから約2ヶ月半、なんとかアプリ第一弾をリリースすることができました。
足し算と引き算の算数アプリなんで特に難しいことはしていないように見えますが、全てが初めての経験なので本当にあちこちにつまずきました。
interface builderを横画面にする方法が分からなかったり、UINavigationViewの使い方なんてまったく意味が分かりませんでしたし、コピペしたコードもなぜか動かなかったり。ノウハウが全然ないからコピペして動かないと何がまずいのか全然わからない。
音の出し方もアニメーションのやり方も苦労しました。
そして最後の難関がアプリの申請作業。
申請作業ってちょっと大変過ぎでしょコレ。
そんなこんなでは苦労しましたが、その苦労のおかげでなんとかアプリの作り方のイメージができるようになり、やりたいことを実現するにはどうすればいいのか、なんとなく分かるようになってきました。
そして現在アプリ第二弾を作成中です。
作成中なのですが、今日までかなりハマっていた問題がありました。
メモリ不足でアプリが落ちてしまう問題です。
続きを読む
UIButtonにイメージを貼り付け、横サイズ280に固定したかったのですが、
イメージが中寄せになるので困っていました。
いろいろ試してみるとこれで右寄せすることができました。
UIButton * button = [[UIButton alloc] init];
[button setImage:img forState:UIControlStateNormal];
button.frame = CGRectMake(10,10,280,img.size.height);
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
iOSアプリ開発の話です。
テスト用のアプリで基本的な動きを学びながら、分かったところで本命アプリに組み込むなんて方法で開発しているのですが、ちょっと複雑にするとすぐ問題が出てきます。
今日発生した問題は画面遷移中に落ちてしまうという問題。
A.「ボタンをタップすると0.3秒のアニメーションがあって、アニメーション後に画面を書き換える」という処理と、
B.「0.1秒毎にtimerを動かしていて、指定した時間が過ぎると時間切れで画面遷移する」という処理があったのですが、
時間切れギリギリにボタンをタップすると、画面遷移のためにviewWillDisappearで変数をnil化した後にAの画面書き換え処理が動いてしまって、nil化した変数にアクセスしてしまい例外が発生していました。
これ、どうしようかと思いましてまずは画面書き換え処理の前にフラグを立てて、処理終了後にフラグを下ろす。フラグが上がっている間は画面遷移せずに待つ。
という方法にしてみました。
一定時間実行を遅らせるために使ったのはこれ。
[NSThread sleepForTimeInterval:0.5];
これで0.5秒待つ。フラグが下りてなかったら再度待つ。5秒待ってもフラグが下りなければ画面遷移強行。ってやってみたのですが、確かにスリープはしていますが、それでもタイミングによっては落ちます。
このsleepForTimeIntervalってのは画面遷移の時間を遅らせると同時に、画面書き換えの処理も止めちゃってますよね?
これじゃ意味ない。
ってわけで次は performselector ってのを使ってみます。
[self performSelector:@selector(OpenNext) withObject:nil afterDelay:0.5];
これで OpenNext という関数を0.5秒後に実行してくれます。
スリープしているわけではないのでその間に画面書き換えの処理は動いて完了してる(っぽい)。
これでどうにか落ちることはなくなりました。
iADというiPhone/iPad向けの広告を試しに入れてみようと試行錯誤しているのですが、表題のエラーが出ました。
iAD関連のライブラリが不適切なんだろうと思ったのですが、よくわからない。
調べてみると、同じような症状の人がいました。
objective c – Sending email in an iPhone application – Stack Overflow
どうやらiAd.frameworkの追加の仕方が悪かった模様です。
左側にある[project navigator]の中に、Finderから直接iAd.frameworkのフォルダをドラッグアンドドロップしていたのですが、これが間違いらしい。
正しいフレームワークの追加方法は、[project navigator]の一番上のプロジェクト名のところをクリック。
[TARGETS]を選択し、一番上の[Build Phase]を選択。
[Link Binary With Libraries]を選択し、そこの[+]マークからお目当てのフレームワークを追加する。
正しい方法で追加すると正常にビルドできました。
以前AVFoundation.frameworkとか追加したことがあったんだけど、偶然正しい方法で追加していたっぽいなぁ。
一週間以上アニメーションのことで悩んでいました。
UIImageViewを画面を表示している間ずっと点滅させたい、やりたかったのはただこれだけなのですが。
ちょっと調べて最初に書いたコードはこんな感じ。
[UIView animateWithDuration:1.0
delay:0.0
options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
animations:^{ flashIV.alpha = 0.0; }
completion:nil
];
flashIVの透明度を1秒かけて1→0へ。その後UIViewAnimationOptionAutoreverseの効果で透明度は再び1秒かけて0→1へ戻る。
UIViewAnimationOptionRepeatを指定しているので、これが延々と繰り返すというもの。
これはこれでちゃんと動いていたのですが、ちょっと問題が。
続きを読む
UIImageを横に連結して新しいUIImageを作るメソッドを作りました。
といってもほとんどこちらのサイト様のコピペです。
→ UIImageの合成 – Horigoodの日記 – iPhoneアプリ開発グループ
コピペで動かなかった部分は書き換えています。
+ (UIImage *)concatImages:(UIImage *)imgA :(UIImage *)imgB
{
int widthA = CGImageGetWidth(imgA.CGImage);
int widthB = CGImageGetWidth(imgB.CGImage);
int height = CGImageGetHeight(imgA.CGImage);
int widthC = widthA + widthB;
unsigned char *bitmap = calloc(widthC * height * 4, sizeof(unsigned char));
CGContextRef bitmapContext = CGBitmapContextCreate(bitmap,
widthC,
height,
8,
widthC * 4,
CGColorSpaceCreateDeviceRGB(),
kCGImageAlphaPremultipliedFirst);
//imgAをbitmapContextに描画
CGContextDrawImage(bitmapContext, CGRectMake(0, 0, widthA, height), imgA.CGImage);
//imgBをimgAの隣に描画
CGContextDrawImage(bitmapContext, CGRectMake(widthA, 0, widthB, height), imgB.CGImage);
//CGContextからCGImageを作成
CGImageRef imgRef = CGBitmapContextCreateImage (bitmapContext);
//CGImageからUIImageを作成
UIImage *imgC = [UIImage imageWithCGImage:imgRef];
//bitmapを解放
free(bitmap);
return imgC;
}
大部分がコピペなのできちんと理解できているか不安です。
間違いとかに気づかれた方いらっしゃいましたらコメントお願いします。
初めてのipadアプリ開発です。
まずxcodeを入れました。
apple storeから無料でダウンロード、インストールできました。
次に、まずは超簡単なテストアプリを作ってみようと探してみて、以下のサイトを見つけました。
続きを読む