[アプリ] ハート文字メーカー


「ハート文字メーカー」(HeartShapedText)というアプリをリリースしました。
このアプリは、好きなメッセージをハート形に変形し、その画像を出力するアプリです。
(※ メッセージに使用できる文字は、アルファベットの大文字と幾つかの記号を12文字までです。小文字や日本語は使用できませんのでご了承下さい。)

各文字、ハートの形、背景それぞれに好きな色、グラデーション、画像を割り当てることができます。
文字に画像を割り当て背景を透明にしたり、背景を画像にしてその上に黒でメッセージを表示したり、様々なデザインを楽しめます。

2023 ANNIV
文字に写真を割り当て、背景をピンクのグラデーションに
文字なしで写真をハート形にしたもの
HANAMI 2023
文字にピンクとブルーのグラデーション、背景に桜の画像を割り当て

ライセンス関連

以下の素材を使用させていただきました。
ありがとうございます。
画像
Export icons created by Anatoly – Flaticon
Delete icons created by feen – Flaticon
Color icons created by Freepik – Flaticon
Freepik
折り紙の画像
恋人の画像 Freepik:(著作者 stockgiu)

viewのframeサイズはできるだけ小さく


Mac Book Airを手に入れてから約2ヶ月半、なんとかアプリ第一弾をリリースすることができました。
足し算と引き算の算数アプリなんで特に難しいことはしていないように見えますが、全てが初めての経験なので本当にあちこちにつまずきました。

interface builderを横画面にする方法が分からなかったり、UINavigationViewの使い方なんてまったく意味が分かりませんでしたし、コピペしたコードもなぜか動かなかったり。ノウハウが全然ないからコピペして動かないと何がまずいのか全然わからない。
音の出し方もアニメーションのやり方も苦労しました。
そして最後の難関がアプリの申請作業。
申請作業ってちょっと大変過ぎでしょコレ。

そんなこんなでは苦労しましたが、その苦労のおかげでなんとかアプリの作り方のイメージができるようになり、やりたいことを実現するにはどうすればいいのか、なんとなく分かるようになってきました。

そして現在アプリ第二弾を作成中です。

作成中なのですが、今日までかなりハマっていた問題がありました。
メモリ不足でアプリが落ちてしまう問題です。

続きを読む

UIbutton上の画像を右寄せ

UIButtonにイメージを貼り付け、横サイズ280に固定したかったのですが、
イメージが中寄せになるので困っていました。

いろいろ試してみるとこれで右寄せすることができました。


UIButton * button = [[UIButton alloc] init];
[button setImage:img forState:UIControlStateNormal];
button.frame = CGRectMake(10,10,280,img.size.height);
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;

performselectorで実行を遅らせる

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秒後に実行してくれます。
スリープしているわけではないのでその間に画面書き換えの処理は動いて完了してる(っぽい)。

これでどうにか落ちることはなくなりました。

file was built for unsupported file format which is not the architecture being linked (i386)

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とか追加したことがあったんだけど、偶然正しい方法で追加していたっぽいなぁ。

NSTimerでアニメーション


一週間以上アニメーションのことで悩んでいました。

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を作るメソッドを作りました。
といってもほとんどこちらのサイト様のコピペです。
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アプリ開発


初めてのipadアプリ開発です。

まずxcodeを入れました。
apple storeから無料でダウンロード、インストールできました。

次に、まずは超簡単なテストアプリを作ってみようと探してみて、以下のサイトを見つけました。
続きを読む